android:使用自定义适配器在ListView内添加SearchView [英] android : adding SearchView inside a ListView with Custom Adaptor

查看:126
本文介绍了android:使用自定义适配器在ListView内添加SearchView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建一个包含3个标签片段的应用.这是片段之一,数据以列表视图显示.我在向列表视图添加搜索过滤器时遇到了麻烦.

I'm creating a an app with 3 tab fragments . this is one of the fragments,, the data is shown in list-view. Im facing trouble in adding a search filter to the list-view ..

我已经在该片段和列表中添加了搜索视图,并且一切正常,但是,在搜索视图中键入内容时,如果没有人知道,请对列表进行排序

I have added search view to this fragment and list and everything working without any error but , when typing in search view list is not sorting if anyone knows please tell my the mistake in my code

logcat消息,代码正在运行,但searchview不起作用

logcat message, code is running but searchview is not working

W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x7f68b3d56a80, error=EGL_SUCCESS
V/RenderScript: 0x7f68b3d72000 Launching thread(s), CPUs 2
W/System: Ignoring header X-Parse-Client-Key because its value was null.
W/System: Ignoring header X-Parse-Client-Key because its value was null.
W/EGL_emulation: eglSurfaceAttrib not implemented
W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x7f68b3e0f740, error=EGL_SUCCESS
W/System: Ignoring header X-Parse-Client-Key because its value was null.
D/score: Retrieved 23 _User
W/Settings: Setting airplane_mode_on has moved from android.provider.Settings.System to android.provider.Settings.Global, returning read-only value.
I/Choreographer: Skipped 59 frames!  The application may be doing too much work on its main thread.
D/score: Retrieved 100 Organization
D/score: Retrieved 100 _User
W/EGL_emulation: eglSurfaceAttrib not implemented
W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x7f68b3daa980, error=EGL_SUCCESS
W/EGL_emulation: eglSurfaceAttrib not implemented
W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x7f68b3f336c0, error=EGL_SUCCESS
W/EGL_emulation: eglSurfaceAttrib not implemented
W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x7f68b3daa300, error=EGL_SUCCESS

...

这是我的适配器java类.

this is my adapter java class .

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.StrictMode;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.parse.ParseObject;
import com.squareup.picasso.Picasso;


import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;


public class IndividualsAdaptor extends ArrayAdapter {

    protected Context mContext;
    protected List mStatus;


    public IndividualsAdaptor(Context context, int individuals, List status) {

        super(context, R.layout.t3, status);
        mContext = context;
        mStatus = status;

    }




    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if (android.os.Build.VERSION.SDK_INT > 9)
        {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }

        if (convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(
                    R.layout.t3, null);
            holder = new ViewHolder();
            holder.usernameHomepage = (TextView) convertView
                    .findViewById(R.id.fname);

            holder.statusHomepage = (TextView) convertView
                    .findViewById(R.id.lname);
            holder.pposition = (TextView) convertView
                    .findViewById(R.id.idposition);

            holder.orgName = (TextView) convertView
                    .findViewById(R.id.organizationname);
            holder.logo = (ImageView) convertView
                    .findViewById(R.id.imageView);

            convertView.setTag(holder);
        } else {

            holder = (ViewHolder) convertView.getTag();

        }
        ParseObject statusObject = (ParseObject) mStatus.get(position);

        // title
        String username = statusObject.getString("firstname");
        holder.usernameHomepage.setText(username);

        // content
        String status = statusObject.getString("lastname");
        holder.statusHomepage.setText(status);
        // content
        String positions = statusObject.getString("position");
        holder.pposition.setText(positions);

        // content
        String org = statusObject.getString("organizationName");
        holder.orgName.setText(org);


        // logo
        URL url = null;

        Bitmap bmp = null;

        try {
            url = new URL("img hosting location" + statusObject.getString("image"));
            bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());


        } catch (MalformedURLException e) {

        }catch (IOException e) {

        }
        holder.logo.setImageBitmap(bmp);




        Picasso.with(mContext)
                .load(String.valueOf(url))
                .into(((ImageView) convertView
                        .findViewById(R.id.imageView)));


        return convertView;

    }

    public static class ViewHolder {
        TextView usernameHomepage;
        TextView statusHomepage;
        TextView orgName;
        TextView pposition;
        ImageView logo;


    }

}

片段Java文件

fragment java file

import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SearchView;


import com.parse.FindCallback;
import com.parse.ParseException;
import com.parse.ParseFile;
import com.parse.ParseObject;
import com.parse.ParseQuery;

import java.net.URL;
import java.util.ArrayList;
import java.util.List;



public class Individuals extends android.support.v4.app.ListFragment
        implements FindCallback<ParseObject> {

    private List<ParseObject> mOrganization = new ArrayList<ParseObject>();

    SearchView sv;
    IndividualsAdaptor adaptor;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


        return inflater.inflate(R.layout.individuals, container, false);
    }
    @Override
    public void onViewCreated(View view, Bundle b) {
        super.onViewCreated(view, b);

        sv=(SearchView) view.findViewById(R.id.searchView1);

        final IndividualsAdaptor adaptor = new IndividualsAdaptor(getActivity(), mOrganization);
        setListAdapter(adaptor);
        ParseQuery.getQuery("_User").findInBackground(this);

        sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String text) {
                // TODO Auto-generated method stub
                return false;
            }
            @Override
            public boolean onQueryTextChange(String text) {

                adaptor.getFilter().filter(text);

                return false;
            }
        });

    }
    @Override
    public void done(List<ParseObject> scoreList, ParseException e) {
        if (e == null) {
            Log.d("score", "Retrieved " + scoreList.size() + " _User");
            mOrganization.clear();
            mOrganization.addAll(scoreList);
            ((IndividualsAdaptor) getListAdapter()).notifyDataSetChanged();
        } else {
            Log.d("score", "Error: " + e.getMessage());
        }
    }
}

列表视图xml

list-view xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
    <SearchView
    android:id="@+id/searchView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:queryHint="Search.."
    >
</SearchView>
    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/searchView1"
        android:layout_marginTop="22dp" >
    </ListView>
</RelativeLayout>

数据xml

data xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">




<ImageView
        android:id="@+id/imageView"
        android:layout_gravity="center"
        android:layout_height="110dp"
        android:layout_width="110dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginLeft="14dp"
        android:layout_marginStart="14dp"
        android:layout_marginTop="19dp"
        />
    <!--  img  -->


    <TextView
        android:text="TextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/organizationname"
        android:textSize="10sp"
        android:layout_below="@+id/idposition"
        android:layout_alignLeft="@+id/idposition"
        android:layout_alignStart="@+id/idposition"
        android:paddingTop="10px" />


    <TextView
        android:text="yyyyyyyyyyyyyyyyy"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/idposition"
        android:textSize="10sp"
        android:layout_below="@+id/fname"
        android:layout_alignLeft="@+id/fname"
        android:layout_alignStart="@+id/fname" />

    <TextView
        android:id="@+id/fname"
        android:text="Name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="12dp"
        android:layout_marginStart="12dp"
        android:textColor="#000"
        android:textSize="12sp"
        android:textStyle="bold"
        android:layout_alignTop="@+id/imageView"
        android:layout_toRightOf="@+id/imageView"
        android:layout_toEndOf="@+id/imageView"
        android:layout_marginTop="13dp"
        android:fontFamily="sans-serif" />

    <TextView
        android:text="TextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/lname"
        android:textColor="#000"
        android:textSize="12sp"
        android:textStyle="bold"
        android:layout_above="@+id/idposition"
        android:layout_toRightOf="@+id/organizationname"
        android:layout_toEndOf="@+id/organizationname" />


</RelativeLayout>

推荐答案

尝试使用此适配器代码:

Try this adapter code:

public class IndividualsAdaptor extends ArrayAdapter {
protected Context mContext;
// Code for Custom Filter.
protected List mBackupList = new ArrayList();

public IndividualsAdaptor(Context context, List status) {
    super(context, R.layout.t3, status);
    mContext = context;
    // Code for Custom Filter.
    mBackupList.addAll(status);
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder;

    if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }

    if (convertView == null) {
        convertView = LayoutInflater.from(mContext).inflate(R.layout.t3, null);
        holder = new ViewHolder();
        holder.usernameHomepage = (TextView) convertView.findViewById(R.id.fname);
        holder.statusHomepage = (TextView) convertView.findViewById(R.id.lname);
        holder.pposition = (TextView) convertView.findViewById(R.id.idposition);
        holder.orgName = (TextView) convertView.findViewById(R.id.organizationname);
        holder.logo = (ImageView) convertView.findViewById(R.id.imageView);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    ParseObject statusObject = (ParseObject) getItem(position);
    // title
    String username = statusObject.getString("firstname");
    holder.usernameHomepage.setText(username);
    // content
    String status = statusObject.getString("lastname");
    holder.statusHomepage.setText(status);
    // content
    String positions = statusObject.getString("position");
    holder.pposition.setText(positions);
    // content
    String org = statusObject.getString("organizationName");
    holder.orgName.setText(org);
    // logo
    URL url = null;
    Bitmap bmp = null;
    try {
        url = new URL("img hosting location" + statusObject.getString("image"));
        bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
    } catch (MalformedURLException e) {
    }catch (IOException e) {
    }
    holder.logo.setImageBitmap(bmp);
    Picasso.with(mContext)
            .load(String.valueOf(url))
            .into(((ImageView) convertView
                    .findViewById(R.id.imageView)));

    return convertView;
}

public static class ViewHolder {
    TextView usernameHomepage;
    TextView statusHomepage;
    TextView orgName;
    TextView pposition;
    ImageView logo;
}

// Code for Custom Filter.
@Override
public Filter getFilter() {return new Filter(){
    @Override
    protected FilterResults performFiltering(CharSequence charSequence) {
        String queryString = charSequence.toString().toLowerCase();
        List<ParseObject> filteredList = new ArrayList<>();
        ParseObject tmpItem;
        String tmpUsername, tmpStatus, tmpPositions, tmpOrg;
        for(int i=0; i<mBackupList.size(); i++){
            tmpItem = (ParseObject) mBackupList.get(i);
            tmpUsername = tmpItem.getString("firstname").toLowerCase();
            tmpStatus = tmpItem.getString("lastname").toLowerCase();
            tmpPositions = tmpItem.getString("position").toLowerCase();
            tmpOrg = tmpItem.getString("organizationName").toLowerCase();
            // The matching condition
            if(tmpUsername.contains(queryString)||tmpStatus.contains(queryString)||
                    tmpPositions.contains(queryString)||tmpOrg.contains(queryString)){
                filteredList.add(tmpItem);
            }
        }
        FilterResults filterResults = new FilterResults();
        filterResults.count = filteredList.size();
        filterResults.values = filteredList;
        return filterResults;
    }
    @Override
    protected void publishResults(CharSequence charSequence, Filter.FilterResults filterResults) {
        clear();
        addAll((List<ParseObject>) filterResults.values);
    }
};}

public void updateBackupList(List newList){
    mBackupList.clear();
    mBackupList.addAll(newList);
}
}

和Individuals.java:

And Individuals.java:

public class Individuals extends ListFragment {
private List<ParseObject> mOrganization = new ArrayList<ParseObject>();
SearchView sv;
IndividualsAdaptor adaptor;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.individuals, container, false);
}

@Override
public void onViewCreated(View view, Bundle b) {
    super.onViewCreated(view, b);
    sv = (SearchView) view.findViewById(R.id.searchView1);
    adaptor = new IndividualsAdaptor(getActivity(), mOrganization);
    setListAdapter(adaptor);
    ParseQuery.getQuery("_User").findInBackground(this);

    sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String text) {
            return false;
        }
        @Override
        public boolean onQueryTextChange(String text) {
            adaptor.getFilter().filter(text);
            return true;
        }
    });
}

@Override
public void done(List<ParseObject> scoreList, ParseException e) {
    if (e == null) {
        Log.d("score", "Retrieved " + scoreList.size() + " _User");
        mOrganization.clear();
        mOrganization.addAll(scoreList);
        ((IndividualsAdaptor) getListAdapter()).updateBackupList(mOrganization);
        ((IndividualsAdaptor) getListAdapter()).notifyDataSetChanged();
    } else {
        Log.d("score", "Error: " + e.getMessage());
    }
}
}

这篇关于android:使用自定义适配器在ListView内添加SearchView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆