首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >过滤4列listview android中的数据

过滤4列listview android中的数据
EN

Stack Overflow用户
提问于 2018-07-04 02:35:07
回答 2查看 51关注 0票数 0

我有一个应用程序,其中包括数据库和显示从数据库获取的数据列表视图。列表视图有4列,每列显示数据库的一列。当我从DB获取数据时,方法以数组列表的形式返回数据。然后,我将arraylist拆分为4个arraylist,并将其发送到自定义适配器,该适配器将4个arraylist作为输入。问题是,当我在客户适配器中使用filter来过滤某列中的数据时,我对该列工作得很好,但其他列保持不变,因此过滤数据的相关数据是不正确的,并且不是该行的相关数据。有没有一种方法可以在过滤数据时获得正确的数据集?请帮帮忙。这是我的自定义适配器。

代码语言:javascript
复制
    package javadi60.saber.storeassistant;

import android.app.Activity;
import android.content.Context;
import android.graphics.Typeface;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class CustomAdapter2 extends BaseAdapter implements Filterable {
    Context context;
    ArrayList<String> lista,listb,listc,listd;
    ArrayList<String> listb2;
    LayoutInflater inflater;
    Typeface tf2;
    int a;



    public CustomAdapter2(Context aplicationContext, ArrayList<String> lista, ArrayList<String> listb, ArrayList<String> listc, ArrayList<String> listd, Typeface tf2, int a) {
        this.context = context;
        this.lista = lista;
        this.listb = listb;
        this.listc = listc;
        this.listd = listd;
        this.listb2=listb;
        this.tf2 = tf2;
        this.a = a;
        inflater=(LayoutInflater.from(aplicationContext));

    }

    @Override
    public int getCount() {
        return listb2.size();
    }

    @Override
    public Object getItem(int i) {
        return listb2.get(i);
    }

    @Override
    public long getItemId(int i) {
        return 0;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        view=inflater.inflate(R.layout.listitem2,null);
        TextView a1=view.findViewById(R.id.itemA);
        TextView a2=view.findViewById(R.id.itemB);
        TextView a3=view.findViewById(R.id.itemC);
        TextView a4=view.findViewById(R.id.itemD);
        ImageView i1=view.findViewById(R.id.item2Image);
        LinearLayout ln2=view.findViewById(R.id.item2Layout);


        i1.setImageResource(a);
        i1.setVisibility(View.GONE);
        a1.setTypeface(tf2);
        a2.setTypeface(tf2);
        a3.setTypeface(tf2);
        a4.setTypeface(tf2);
        a1.setText(lista.get(i));
        a2.setText(listb2.get(i));
        a4.setText(listc.get(i));
        a3.setText(listd.get(i));




        int s=Integer.parseInt(listc.get(i));
        if (s<a){
            ln2.setBackgroundResource(R.color.list2);
        }



        return view;
    }

    public void ClearList(){
        lista.clear();
        listb.clear();
        listc.clear();
        listd.clear();
    }

    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results = new FilterResults();

                if (constraint == null || constraint.length() == 0) {
                    //no constraint given, just return all the data. (no search)
                    results.count = listb.size();
                    results.values = listb;
                } else {//do the search
                    List<String> resultsData = new ArrayList<>();
                    String searchStr = constraint.toString().toUpperCase();
                    for (String s : listb)
                        if (s.toUpperCase().contains(searchStr)) resultsData.add(s);
                    results.count = resultsData.size();
                    results.values = resultsData;
                }

                return results;
            }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                listb2 = (ArrayList<String>) results.values;
                notifyDataSetChanged();
            }
        };}



}

正如我所说的,过滤器在指定的列中做得很好,但其他列中的数据保持不变,行数据为false。请告诉我解决这个问题的方法。

EN

回答 2

Stack Overflow用户

发布于 2018-07-04 03:09:07

与其将UI拆分成4个列表视图,不如使用一个包含4个水平文本视图(每列一个)的列表视图,如下所示:

TextView1 | TextView2 | TextView3 | TextView4

为此,您可以使用水平LinearLayout

使用单个适配器。这将解决您的过滤问题,还将减少管理4个不同列表所需的工作量。

代码语言:javascript
复制
List data = new ArrayList<Data>();

Class Data {
    String a;
    String b;
    String c;
    String d;
}
票数 1
EN

Stack Overflow用户

发布于 2018-07-09 21:32:48

问题解决了。对于任何可能遇到像我这样的问题的人,我的问题通过如下所示的更改配置适配器解决了:

代码语言:javascript
复制
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Typeface;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import static javadi60.saber.storeassistant.setting.MyPREFERENCES;

public class CustomAdapter2 extends BaseAdapter implements Filterable {
    Context context;
    ArrayList<String> lista,listb,listc,listd;
    ArrayList<String> listb2;
    ArrayList<String> lista2=new ArrayList<>();
    ArrayList<String> listc2=new ArrayList<>();
    ArrayList<String> listd2=new ArrayList<>();
    LayoutInflater inflater;
    Typeface tf2;
    int a;
    List<Integer> index=new ArrayList<>();
    SharedPreferences preferences;
    public static final String TEXTSIZE="textsize";
    int txtsize;



    public CustomAdapter2(Context aplicationContext, ArrayList<String> lista, ArrayList<String> listb, ArrayList<String> listc, ArrayList<String> listd, Typeface tf2, int a) {
        this.context = context;
        this.lista = lista;
        this.listb = listb;
        this.listc = listc;
        this.listd = listd;
        this.listb2=listb;
        this.lista2=lista;
        this.listc2=listc;
        this.listd2=listd;
        this.tf2 = tf2;
        this.a = a;
        inflater=(LayoutInflater.from(aplicationContext));
        preferences = aplicationContext.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);

    }


    @Override
    public int getCount() {
        return listb2.size();
    }

    @Override
    public Object getItem(int i) {
        return listb2.get(i);
    }

    @Override
    public long getItemId(int i) {
        return 0;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        view=inflater.inflate(R.layout.listitem2,null);
        TextView a1=view.findViewById(R.id.itemA);
        TextView a2=view.findViewById(R.id.itemB);
        TextView a3=view.findViewById(R.id.itemC);
        TextView a4=view.findViewById(R.id.itemD);
        ImageView i1=view.findViewById(R.id.item2Image);
        LinearLayout ln2=view.findViewById(R.id.item2Layout);


        i1.setImageResource(a);
        i1.setVisibility(View.GONE);
        a1.setTypeface(tf2);
        a2.setTypeface(tf2);
        a3.setTypeface(tf2);
        a4.setTypeface(tf2);

        if (preferences.contains(TEXTSIZE)){
            txtsize=preferences.getInt(TEXTSIZE,13);
        }
        a1.setTextSize(txtsize);
        a2.setTextSize(txtsize);
        a3.setTextSize(txtsize);
        a4.setTextSize(txtsize);


        a1.setText(lista2.get(i));
        a2.setText(listb2.get(i));
        a4.setText(listc2.get(i));
        a3.setText(listd2.get(i));




        int s=Integer.parseInt(listc.get(i));
        if (s<a){
            ln2.setBackgroundResource(R.color.list2);
        }



        return view;
    }

    public void ClearList(){
        lista.clear();
        listb.clear();
        listc.clear();
        listd.clear();
    }

    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results = new FilterResults();

                if (constraint == null || constraint.length() == 0) {
                    //no constraint given, just return all the data. (no search)
                    results.count = listb.size();
                    results.values = listb;
                    index.clear();

                } else {//do the search
                    List<String> resultsData = new ArrayList<>();
                    String searchStr = constraint.toString().toUpperCase();
                    List j;
                    int i=0;
                    index.clear();
                    for (String s : listb){
                        if (s.toUpperCase().contains(searchStr))
                        {
                            resultsData.add(s);
                            index.add(i);
                        }
                        i++;}

                    results.count = resultsData.size();
                    results.values = resultsData;

                }

                return results;
            }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                listb2 = (ArrayList<String>) results.values;
                editlist();
                notifyDataSetChanged();
            }
        };}

public void editlist(){
    ArrayList<String> a3=new ArrayList<>();
    ArrayList<String> c3=new ArrayList<>();
    ArrayList<String> d3=new ArrayList<>();
    int k=index.size();
if (index.isEmpty()){
    a3=lista;
    c3=listc;
    d3=listd;
}
else{

    for (int h=0;h<k;){
        int l=index.get(h);
        c3.add(listc.get(l));
        a3.add(lista.get(l));
        d3.add(listd.get(l));
        h++;
    }
 }   
    lista2=a3;
    listd2=d3;
    listc2=c3;
  }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51161020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档