Listview仅显示数组列表的第一个结果

时间:2019-08-16 10:18:05

标签: java android-studio listview arraylist

我有下面的代码显示数组列表中的结果,但是,它仅显示测试结果,我将相同的结果附加到文本视图中进行测试,发现从查询方法获得的结果确实包含不止一个,并且它们已经出现在文本视图中,但是列表视图仅显示第一个。 请在下面的代码中找到附带的图片。

// searchactivity.class //

package com.example.boc.search;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

import com.example.boc.Interface.IMainActivity;
import com.example.boc.R;
import com.example.boc.main.phone_nombers_Activity;
import com.example.boc.models.Note;
import com.example.boc.models.Search;
import com.google.android.gms.tasks.OnCompleteListener;

import android.widget.ArrayAdapter;

import com.google.android.gms.tasks.Task;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.Query;
import com.google.firebase.firestore.QueryDocumentSnapshot;
import com.google.firebase.firestore.QuerySnapshot;

import java.util.ArrayList;

public class searchActivity extends phone_nombers_Activity implements
        View.OnClickListener,
        IMainActivity
{

    private DocumentSnapshot documentSnapshot;
    ListView listView;
    public TextView resultTxt , userinput ;
    private ArrayList<Search> mSearch = new ArrayList<>();


    public FirebaseFirestore db = FirebaseFirestore.getInstance();
    public Note note ;
    public LinearLayout layout ;

    private ArrayList<Note> mNotes = new ArrayList<>();

    private DocumentReference noteRef = db.collection("notes").document();
    private CollectionReference notesCollectionRef = db.collection("notes");
    private RecyclerView mRecyclerView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_search );
        final ListView listView = findViewById( R.id.listview4 );
        final EditText userinput = findViewById( R.id.userInputtxt );
        final Button   findbutton = findViewById( R.id.findBtn );
        final TextView resultTxt = findViewById( R.id.resultTxt );
        mRecyclerView = findViewById(R.id.recycler_view);





        FirebaseFirestore db = FirebaseFirestore.getInstance();

        CollectionReference notesCollectionRef = db
                .collection("notes");

        Query notesQuery = null;
        if(documentSnapshot != null){
            notesQuery = notesCollectionRef;

        }
        else{
            notesQuery = notesCollectionRef
                    .orderBy("timestamp", Query.Direction.ASCENDING);
        }


        notesQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if(task.isSuccessful()){
                    String data = "";

                    for(final QueryDocumentSnapshot document: task.getResult()){
                        Note note = document.toObject(Note.class);

                        mNotes.add(note);
                        if( userinput !=null ) {
                            findbutton.setOnClickListener( new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {
                                    final String userinputString = userinput.getText().toString();

                                    Note match = null;
                                    String matcheddata ="";
                                    for (Note note : mNotes) {
                                        if (note.getTitle().contains(userinputString)) {
                                            match = note;
                                            String matchedtitle = match.getTitle();
                                            String matchedcontent = match.getContent();
                                            matcheddata += "هاتف:" + matchedcontent + "\nالاسم:" + matchedtitle + "\n\n";


                                    }
                                    if (match != null) {
                                         ArrayList<String> namesList = new ArrayList<>();
                                        resultTxt.setText( matcheddata );
                                        namesList.clear();
                                        ArrayAdapter<String>adapter = new ArrayAdapter<>( getApplicationContext(), android.R.layout.simple_selectable_list_item, namesList );
                                        adapter.notifyDataSetChanged();
                                        listView.setAdapter(adapter);
                                        namesList.add(matcheddata);





                                        // Found a match








                                        //previewResultTextview.setOnClickListener( new View.OnClickListener() {
                                         //   @Override
                                          //  public void onClick(View v) {
                                           //     String content = previewResultTextview.getText().toString();
                                            //    Intent intent = new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", contenttoparse, null));
                                            //    startActivity(intent);

                                          //  }
                                       // } );


                                    }





                                    }
                                }

                            } );


                        }
                        else {
                            userinput.setError( "اسم الملف مطلوب" );

                        }





                    }
                }
            }
        });


    }




    @Override
    public void onStart () {

        super.onStart();

    }
}

// searchactivity.xml //

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".search.searchActivity">

    <EditText
        android:id="@+id/userInputtxt2"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:layout_marginStart="8dp"
        android:paddingTop="50dp"
        android:textColor="@color/Black"
        android:textSize="18sp" />

    <EditText
        android:id="@+id/userInputtxt"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:layout_marginStart="8dp"
        android:paddingTop="50dp"
        android:textColor="@color/Black"
        android:textSize="18sp" />

    <Button
        android:id="@+id/findBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="320dp"
        android:layout_marginEnd="3dp"
        android:text="find"
        android:textSize="10sp" />

    <ListView
        android:id="@+id/listview4"
        android:layout_width="398dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="55dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp">
    </ListView>

    <TextView
        android:id="@+id/resultTxt"
        android:layout_width="match_parent"
        android:layout_height="203dp"
        android:layout_marginTop="450dp"

        android:background="@color/transparentGrey"
        android:text="TextView" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

same results on list view and text view

2 个答案:

答案 0 :(得分:1)

if (match != null) {
    ArrayList<String> namesList = new ArrayList<>();
    resultTxt.setText( matcheddata );
    // namesList.clear(); // You don't need to clear it as you just created it above
    namesList.add(matcheddata);
    ArrayAdapter<String> adapter = new ArrayAdapter<>( getApplicationContext(), android.R.layout.simple_selectable_list_item, namesList );
    listView.setAdapter(adapter);
}

嗨Amer Anajjem,您能在创建适配器之前尝试准备namesList并使用最新的namesList创建适配器吗?

编辑:

我发现问题是:matcheddata是一个字符串。调用namesList.add(matcheddata);时,您仅在列表中添加了1个项目。结果,您在列表视图中只有1个项目。为了证明这一点,您可以尝试以下操作:

if (match != null) {
    ArrayList<String> namesList = new ArrayList<>();
    resultTxt.setText( matcheddata );
    namesList.clear();
    namesList.add(matcheddata);
    namesList.add(matcheddata);
    ArrayAdapter<String> adapter = new ArrayAdapter<>( getApplicationContext(), android.R.layout.simple_selectable_list_item, namesList );
    listView.setAdapter(adapter);
}

您应该在列表视图中看到2个重复项。

编辑2:

您可以尝试一下,但是我没有测试。

package com.example.boc.search;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

import com.example.boc.Interface.IMainActivity;
import com.example.boc.R;
import com.example.boc.main.phone_nombers_Activity;
import com.example.boc.models.Note;
import com.example.boc.models.Search;
import com.google.android.gms.tasks.OnCompleteListener;

import android.widget.ArrayAdapter;

import com.google.android.gms.tasks.Task;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.Query;
import com.google.firebase.firestore.QueryDocumentSnapshot;
import com.google.firebase.firestore.QuerySnapshot;

import java.util.ArrayList;

public class searchActivity extends phone_nombers_Activity implements
        View.OnClickListener,
        IMainActivity
{

    private DocumentSnapshot documentSnapshot;
    ListView listView;
    public TextView resultTxt , userinput ;
    private ArrayList<Search> mSearch = new ArrayList<>();


    public FirebaseFirestore db = FirebaseFirestore.getInstance();
    public Note note ;
    public LinearLayout layout ;

    private ArrayList<Note> mNotes = new ArrayList<>();

    private DocumentReference noteRef = db.collection("notes").document();
    private CollectionReference notesCollectionRef = db.collection("notes");
    private RecyclerView mRecyclerView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_search );
        final ListView listView = findViewById( R.id.listview4 );
        final EditText userinput = findViewById( R.id.userInputtxt );
        final Button   findbutton = findViewById( R.id.findBtn );
        final TextView resultTxt = findViewById( R.id.resultTxt );
        mRecyclerView = findViewById(R.id.recycler_view);

        FirebaseFirestore db = FirebaseFirestore.getInstance();

        CollectionReference notesCollectionRef = db
                .collection("notes");

        Query notesQuery = null;
        if(documentSnapshot != null){
            notesQuery = notesCollectionRef;

        }
        else{
            notesQuery = notesCollectionRef
                    .orderBy("timestamp", Query.Direction.ASCENDING);
        }


        notesQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if(task.isSuccessful()){
                    String data = "";

                    for(final QueryDocumentSnapshot document: task.getResult()){
                        Note note = document.toObject(Note.class);

                        mNotes.add(note);
                        if( userinput !=null ) {
                            findbutton.setOnClickListener( new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {
                                    final String userinputString = userinput.getText().toString();

                                    ArrayList<String> namesList = new ArrayList<>();
                                    for (Note note : mNotes) {
                                        if (note.getTitle().contains(userinputString)) {
                                            String matchedtitle = note.getTitle();
                                            String matchedcontent = note.getContent();
                                            String matcheddata += "هاتف:" + matchedcontent + "\nالاسم:" + matchedtitle + "\n\n";
                                            namesList.add(matcheddata);
                                    }

                                    ArrayAdapter<String> adapter = new ArrayAdapter<>( getApplicationContext(), android.R.layout.simple_selectable_list_item, namesList );
                                    listView.setAdapter(adapter);
                                }

                            } );
                        }
                        else {
                            userinput.setError( "اسم الملف مطلوب" );
                        }
                    }
                }
            }
        });
    }

    @Override
    public void onStart () {

        super.onStart();

    }
}

答案 1 :(得分:0)

我认为是适配器通知问题。

  • 您要给适配器提供0大小列表,并立即通知适配器。

  • 我认为应该在添加列表后通知您适配器。 ,您可以在调用适配器类之前将数据添加到列表中。

  

示例

notesQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if(task.isSuccessful()){
                String data = "";

                for(final QueryDocumentSnapshot document: task.getResult()){
                    Note note = document.toObject(Note.class);

                    mNotes.add(note);
                    if( userinput !=null ) {
                        findbutton.setOnClickListener( new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                final String userinputString = userinput.getText().toString();

                                Note match = null;
                                String matcheddata ="";
                                for (Note note : mNotes) {
                                    if (note.getTitle().contains(userinputString)) {
                                        match = note;
                                        String matchedtitle = match.getTitle();
                                        String matchedcontent = match.getContent();
                                        matcheddata += "هاتف:" + matchedcontent + "\nالاسم:" + matchedtitle + "\n\n";
                                    }
                                }
                                if (match != null) {
                                    ArrayList<String> namesList = new ArrayList<>();
                                    resultTxt.setText( matcheddata );
                                    namesList.clear();
                                    namesList.add(matcheddata);
                                    ArrayAdapter<String>adapter = new ArrayAdapter<>( getApplicationContext(), android.R.layout.simple_selectable_list_item, namesList );
                                    listView.setAdapter(adapter);
                                }
                            }
                        } );
                    }
                    else {
                        userinput.setError( "اسم الملف مطلوب" );
                    }
                }
            }
        }
    });
  • 只需更改您的功能并尝试。