我有一个应用程序,其中包括数据库和显示从数据库获取的数据列表视图。列表视图有4列,每列显示数据库的一列。当我从DB获取数据时,方法以数组列表的形式返回数据。然后,我将arraylist拆分为4个arraylist,并将其发送到自定义适配器,该适配器将4个arraylist作为输入。问题是,当我在客户适配器中使用filter来过滤某列中的数据时,我对该列工作得很好,但其他列保持不变,因此过滤数据的相关数据是不正确的,并且不是该行的相关数据。有没有一种方法可以在过滤数据时获得正确的数据集?请帮帮忙。这是我的自定义适配器。
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。请告诉我解决这个问题的方法。
发布于 2018-07-04 03:09:07
与其将UI拆分成4个列表视图,不如使用一个包含4个水平文本视图(每列一个)的列表视图,如下所示:
TextView1 | TextView2 | TextView3 | TextView4
为此,您可以使用水平LinearLayout
使用单个适配器。这将解决您的过滤问题,还将减少管理4个不同列表所需的工作量。
List data = new ArrayList<Data>();
Class Data {
String a;
String b;
String c;
String d;
}
发布于 2018-07-09 21:32:48
问题解决了。对于任何可能遇到像我这样的问题的人,我的问题通过如下所示的更改配置适配器解决了:
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;
}
}
https://stackoverflow.com/questions/51161020
复制相似问题