MarkLogic関数cts:urisの注意点

何かと不思議なcts:urisの注意点覚書です。
気づいたところがあれば追記していきます。

 

1.1つ目の引数は辞書的な意味で"最初の文字"を指定する
/apple/test/001.xml

/apple/test/002.xml

/apple/test/003.xml

/banana/test/001.xml

/orange/test/001.xml

役に立たない例ですが、何らかのクエリ($query)を用いて/apple/配下のドキュメントを検索しようと思い、このように書くと、

cts:yris("/apple/", (), $query)

 
クエリ条件が満たされている場合、/bananaや/orangeも検索結果に出てしまいます。

2.こうする
cts:directoryを使いましょう。

cts:uris( (), (),
     cts:and-query((cts:directory-query("/apple/"), $query)
     )
)

床屋へ行った。

 

朝ごはんは苔むしたぱんをいただきました。11:00から団地の下の床屋に予約あり。

散歩ついでの帰りに向かった。

 

「ずいぶんのびましたね」

ええ、実は床屋は2か月ぶりだ。前の土日は、息子が「カブトムシみたい」っていうからわざわざ同級生のブルーベリー農家に連絡して、ビニールハウスでぬくぬくしてる奴らを拝みに行ったし、夜勤明けで風呂入ってから寝ると、結局汗だくで起きることになるし。どういうことかっていうとね、朝にシャワー浴びると、自分で掃除することになる。夜シャワーへやってくる嫁一同皆々様のために、腕まくりするのはめんどくさいけど、って考えてるうちに休日が終わるんだよね、最近ほんと日にちが経つのってはやいです。

 

「・・・・・・」

 

そこでほんとにおかしなことがあった。鏡ごしに黙って切る大将を見たら、どうみても使ってるはさみ、あれは俺の息子の子供用のやつだったんだ。親指入れるところが黄色で、ええっと、もうひとつ指入れるところがオレンジ色の野菜ジュースみたいなはさみ。

 

この前親戚から梨が届いたときに、あれを息子から借りたんだけど、あれは紙を切るだけしか使えないと思う。ガムテープ切るにも一苦労。

そんなもので髪を切って、切れるのかしら?2週間後、授業参観がある。「ちゃんとした格好で」というのはまだ小学生の息子から言われたことはないけど、子供のへたくそな工作みたいな、ぎざぎざの髪型だったらいじめ、って最近はなんでもなっていってしまうらしいので。そういえば息子の夏休みの工作、手伝ってやらなきゃな。

そうしているうちに、大将がくしでしゃっしゃっと髪をとかし始めて、

「終わりました」と。

 

へえ、うまいものだ。軽い足取りで家に帰ると、息子は銀色にとがった大きなはさみで工作用紙を切って、迷路を作っていた。ビー玉を転がす迷路だ。

 

 ※「誰かの日記」は世界中の誰かがどこかで書いているかもしれない1ページの日記です。実在の人物や団体と関係があるかもしれないし、ないかもしれません。

RecyclerViewをはじめて見た人

駅のホーム降りて、エスカレーターを降りるたとき、ふとRecyclerViewを実装したくなりました。

偶然にもAndroid Studioもインストールしてあったため、やってみることにしました。
どのサイトを見てもアホな私にはわかりにくかったため、これ見れば誰でもできる(少なくとも私は)というようなまとめをかいてみます。用語もわからないので感覚です。
間違いがあったらお教えください。

  • やりたいこと

1.Gmailみたいなリストを作る
 2.スワイプして削除
 3.ぐりぐり動かして並び替え

  • まず、作成したxmlビュー一覧です。
名前 役割
one_item 1行分のデータのレイアウトを決める
activity_main ここにRecyclerViewを入れる

 

  • まず、実装したクラスをすべてまとめました。MainActivityは除いてます。
クラス名(引数型) スーパークラス 役割
OneItem なし 1行分のデータの中身を決める
ViewHolder(View) RecyclerView.ViewHolder xmlで決めた1行分のデータViewを受け取って、ついでにその中の情報をもらう
RecyclerViewAdapter(MutableList) RecyclerView.Adapter 上で1行1行ちまちまつくってたのをまとめて、RecyclerView本体にセット!

クラスごとのコードです。必要最小限の実装にしてあるので、これをサンプルにして他の機能を追加してください。自分用のメモでもあるので、省略せず全部書きます。

1.one_item.xml・・・・・・textViewだけ実装しておきます。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                                   xmlns:app="http://schemas.android.com/apk/res-auto"
                                                   xmlns:tools="http://schemas.android.com/tools"
                                                   android:orientation="vertical"
                                                   android:layout_width="match_parent"
                                                   android:layout_height="120dp">
    <TextView
            android:layout_width="100dp"
            android:layout_height="wrap_content" android:id="@+id/textview"
            app:layout_constraintBottom_toBottomOf="parent" android:layout_marginTop="8dp"
            app:layout_constraintTop_toTopOf="parent" app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="8dp" app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="8dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>

2. activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        tools:showIn="@layout/activity_main"
        tools:context=".MainActivity">
    <androidx.recyclerview.widget.RecyclerView
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="0.1"
            android:id="@+id/recyclerView"/>
</androidx.constraintlayout.widget.ConstraintLayout>


3.ViewHolderクラス

package com.(プロジェクト名).recyclertest

import android.view.View
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.one_item.view.*

class ViewHolder(itemView : View): RecyclerView.ViewHolder(itemView){
        var text : TextView? = null

        init{   //コンストラクタ
            text = itemView.textview
        }
}


4. OneItemクラス

package com.(プロジェクト名).recyclertest

class OneItem() {
    var text:String = ""
}

5.CustomRecyclerViewAdapterクラス
勝手にオーバーライドしてきたメソッドたちです。こういうのが必要なんでしょうね。
・ミュータブルリストを受け取ります。MainActivityで作成しているのですが、ここに1つ1つの行のデータが入っているので、責任重大です。

メソッド名 役割
onCreateViewHolder ViewHolderを作成します。
getItemCount リストの中身の数を返します。結局使わなかったけど、全何件!とかを出すときには使えると思います。
onBindViewHolder リストの要素1つ1つとViewHolderを結び付けます。
package com.(プロジェクト名).recyclertest

import android.content.Intent
import android.graphics.Color
import android.text.format.DateFormat
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView

class CustomRecyclerViewAdapter(list : MutableList<OneItem>):RecyclerView.Adapter<ViewHolder>() {
    private val list:MutableList<OneItem> = list

    override fun onCreateViewHolder(parent: ViewGroup, position: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.one_item,parent,false)
        val viewholder = ViewHolder(view)   //ViewHolderを生成、それを返す
        return viewholder
    }

    override fun getItemCount(): Int {
        //サイズ
        return list.size
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val item = list[position]
        holder.text?.text = item.text
    }
}

6.MainActivityクラス

package com.(プロジェクト名).recyclertest

import android.media.MediaRouter
import android.os.Bundle
import com.google.android.material.snackbar.Snackbar
import androidx.appcompat.app.AppCompatActivity;
import android.view.Menu
import android.view.MenuItem
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView

import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    private lateinit var adapter:CustomRecyclerViewAdapter
    private lateinit var layoutManager: RecyclerView.LayoutManager
    private lateinit var itemDecoration: DividerItemDecoration

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    override fun onStart() {
        super.onStart()

        itemDecoration = DividerItemDecoration(this,DividerItemDecoration.VERTICAL)
        layoutManager = LinearLayoutManager(this)
        recyclerView.layoutManager=layoutManager
        adapter = CustomRecyclerViewAdapter(makeRecyclerData())
        recyclerView.adapter = this.adapter
        recyclerView.addItemDecoration(itemDecoration)
    val itemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP or ItemTouchHelper.DOWN, ItemTouchHelper.LEFT) {

            override fun onMove(
                recyclerView: RecyclerView,
                viewHolder: RecyclerView.ViewHolder,
                target: RecyclerView.ViewHolder
            ): Boolean {
                val from = viewHolder.adapterPosition?:0
                val to = target.adapterPosition?:0
                recyclerView.adapter?.notifyItemMoved(from,to)
                return true
            }

            override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
               viewHolder.let{
                   recyclerView.adapter?.notifyItemRemoved(viewHolder.adapterPosition)
               }
            }})
        itemTouchHelper.attachToRecyclerView(recyclerView)
    }

    fun makeRecyclerData():MutableList<OneItem>{
       var recyclerData :MutableList<OneItem> = mutableListOf()

        for(i in 0..50){
            var oneitem:OneItem= OneItem()
            oneitem.text="アイテム"+i.toString()
            recyclerData.add(oneitem)
        }

        return recyclerData
    }
}

注意点1.RecyclerViewには区切り線をxmlで実装する方法がないようです。
そのため、MainActivityで

itemDecoration = DividerItemDecoration(this,DividerItemDecoration.VERTICAL)

注意点2.スワイプして削除、ドラッグして入れ替えしているのはこの部分。

val itemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP or ItemTouchHelper.DOWN, ItemTouchHelper.LEFT) {

            override fun onMove(
                recyclerView: RecyclerView,
                viewHolder: RecyclerView.ViewHolder,
                target: RecyclerView.ViewHolder
            ): Boolean {
                val from = viewHolder.adapterPosition?:0
                val to = target.adapterPosition?:0
                recyclerView.adapter?.notifyItemMoved(from,to)
                return true
            }

            override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
               viewHolder.let{
                   recyclerView.adapter?.notifyItemRemoved(viewHolder.adapterPosition)
               }
            }})
        itemTouchHelper.attachToRecyclerView(recyclerView)
    }

その他解説は少しずつ追加していきたいと思います。
醜いコードだとは思いますが・・・その辺ご指摘お願いいたします。