OnitemClickは、間違った文字列値を返します。

markharrop:

Firebaseでの作業。私はFirebaseとカスタムリストビューを使用して画像ビュー、のTextViewを投入しようとしています。ユーザーがリストから項目を選択したときに、私のデータベースのユーザーセクションにFirebaseアイテムのIDを保存することになっています。

すべての項目がリストビューに正しく取り込むが、私は唯一の位置0の項目を選択し、5時に、実際には常にPOSを返し1-5バックをループ項目の残りの部分を作業しています。あなたは私のコードを見てみるのn私は間違っおかげで何をやったか教えてくださいすることができます:)

private void Display_Images() {

    ListView listOfImages = findViewById(R.id.avatar_list);
    listOfImages.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            FirebaseAuth mAuth  =FirebaseAuth.getInstance();
            String userid = mAuth.getUid();
            avatar_id = AVATAR_ID.get(position);
            DatabaseReference db = FirebaseDatabase.getInstance().getReference().child("Users").child(userid);
            db.child("avatarID").setValue(avatar_id);
            finish();
        }
    });

    adapter = new FirebaseListAdapter<Image_Selector>(this, Image_Selector.class,
            R.layout.avatars, FirebaseDatabase.getInstance().getReference().child("Avatars")) {
        @Override
        protected void populateView(View v, Image_Selector model, int position) {
            imageView = v.findViewById(R.id.image);
             tv = v.findViewById(R.id.tvavatar);
             AVATAR_ID.add(model.getID());
            tv.setText(model.getName());
            Glide.with(getBaseContext()).load(model.getUrl()).into(imageView);

        }


    };
    listOfImages.setAdapter(adapter);
}

これは私のデータベースです

 "Avatars" : {
"Batman1" : {
  "id" : "Batman1",
  "name" : "Batman Logo",
  "url" : "url to image"
},
"Default" : {
  "id" : "Default",
  "name" : "Default",
  "url" : "url to image"
},
"Test" : {
  "id" : "Test",
  "name" : "TEST",
  "url" : ""
}

リストビュー内の項目をクリックしたときに、私は、文字列としてIDを保存しようとしています。その後、私のデータベースのユーザーセクションにそれを保存します。以下の例。

"Users" : {
"F3vHZSClnPhE9cDjPeY5x0PuTmz1" : {
  "Username" : "Username Appears here.",
  "avatarID" : "here is where the id should be saved",
},

**** **** EDIT

これは私のfirebaseモデルクラスであります

 public class Image_Selector {
String name;
String url;
String id;
public Image_Selector(String name,String url,String id){
   this.name = name;
   this.url = url;
   this.id = id;

}
public Image_Selector(){

}
 public void setName(String name) {
    this.name = name;
}

public void setUrl(String url) {
    this.url = url;
}

public void setId(String id) {
    this.id = id;
}

public String getName() {
    return name;
}

public String getUrl() {
    return url;
}

public String getId() {
    return id;
}

**** **** EDIT

何が起こっているかの例は、私はバットマンを選択した場合返されたIDがbatman1です。私はテスト項目を選択した場合、私はそれがIDのデフォルトを返すデフォルト選択した場合、それはまだバットマン1. IDを返します。私は、データベースにさらにいくつかの項目を追加し、ループの並べ替えを行います私のカスタムlistviewitem.xmlの高さと幅に応じて、試してみました。私だけは、私が見ることができるリストビュー項目からあるidをキャプチャすることができます。画面オフ任意の項目は、間違ったIDは、POSにループバック0,1,2,3というように返されます。

**** **** EDIT

私onitemクリックメソッドにログを追加しました

 String pos =  String.valueOf(position);
            Log.i("String_ID ",avatar_id);
            Log.i("String_POSITION ",pos);
            Log.i("String_USERID",userid);

3つの項目のそれぞれについて、以下のような結果が戻ってきました

私のリストビュー内の項目1はバットマンとリターンです

2019-07-11 12:04:51.152 3685-3685/studios.p9p.chatomatic.chat_o_matic 
I/String_ID: Batman1
2019-07-11 12:04:51.152 3685-3685/studios.p9p.chatomatic.chat_o_matic 
I/String_POSITION: 0
2019-07-11 12:04:51.152 3685-3685/studios.p9p.chatomatic.chat_o_matic 
I/String_USERID: F3vHZSClnPhE9cDjPeY5x0PuTmz1

私のリストビュー内の項目2がデフォルトし、戻ります

2019-07-11 12:06:22.920 3685-3685/studios.p9p.chatomatic.chat_o_matic 
I/String_ID: Default
2019-07-11 12:06:22.935 3685-3685/studios.p9p.chatomatic.chat_o_matic 
I/String_POSITION: 1
2019-07-11 12:06:22.935 3685-3685/studios.p9p.chatomatic.chat_o_matic 
I/String_USERID: F3vHZSClnPhE9cDjPeY5x0PuTmz1

私のリストビュー内の項目3は、テストし、戻ります

2019-07-11 12:07:18.983 3685-3685/studios.p9p.chatomatic.chat_o_matic 
I/String_ID: Batman1
2019-07-11 12:07:18.984 3685-3685/studios.p9p.chatomatic.chat_o_matic 
I/String_POSITION: 2
2019-07-11 12:07:18.984 3685-3685/studios.p9p.chatomatic.chat_o_matic 
I/String_USERID: F3vHZSClnPhE9cDjPeY5x0PuTmz1

したがってこのことから、私は実際のモデルが最初の場所で右のIDを与えるかどうかを確認するためにアイブ氏は、移入方法にログを追加avatarid文字列で行うには、その何かを考え出してきました

 String modelid = model.getID();
            Log.i("String_id_AtSource",modelid);

2019-07-11 12:20:34.504 3685-3685/studios.p9p.chatomatic.chat_o_matic 
I/String_id_AtSource: Test

それが右のIDを提供します。それは、Array AVATAR_IDとは何かをしなければなりませんか?

***** EDIT 21/7/2019 ******

[OK]をので、それを固定しているように見えたの下に答えを使用。しかし、以来、IVEは、データベースに複数の項目を追加しました。それはまだそれをやっているようです。それが起こるときに、更なる試験から、私はあなたを伝えることができます。..

あなたがスクロールするまで、すべてのIDが正しく取り込みます。この手段は、長いすべてのリスト項目が画面に収まるよう、彼らは右のIDを返すこととして。したがって、なぜ私はそれが答え以下で固定していたと思いました。

私は最初、それが故にのみの2つの項目の大きなリストビュー項目だったので、乗300dpにImageViewのサイズのセットを持っていた正常に動作します。90dpにサイズを変更すると、5つの項目が収まるように、それを作ったの二乗しました。

アイテム0、項目1 Nように項目7戻るIDの最初の5例えばクリック項目6戻るIDからループ内のリスト項目IDSリターン。しかし、リストビュー項目、リスト内のすべてのデータの位置は正しいです

最初のページには、すべて正常に動作します。私はそれはおそらく、画像が大きすぎるあったかどうかを確認しようとする画像表示を削除しました

すべてのIDは、最初のページからのループに戻る2ページ目は、アイテムマリオはバットマンのIDおよびDJ・ラマのアイテムスパイダーマン戻っIDを返します。例えば

バートラムGilfoyle:

原因

順序populateView()位置のために呼び出され、画面内のすべてのリストフィットしない限り、予測することはできません。彼らは、それ以外の位置のために、すべて一度に呼び出されません。したがって、リストはAVATAR_ID、リストが大きい場合は無効です。


解決

置き換えます avatar_id = AVATAR_ID.get(position);

とともに avatar_id = ((Image_Selector)parent.getItemAtPosition(position)).getID();

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=226178&siteId=1