android: добавление SearchView внутри пользовательского ListView с пользовательским адаптером

Я создаю приложение с 3 фрагментами вкладок. это один из фрагментов, данные отображаются в виде списка. Я столкнулся с проблемой при добавлении фильтра поиска в список.

Я добавил представление поиска к этому фрагменту и списку, и все работает без ошибок, но при вводе списка представления поиска не сортируется, если кто-нибудь знает, пожалуйста, сообщите мне об ошибке в моем коде

сообщение logcat, код работает, но поиск не работает

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.

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-файла

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-представление списка

<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-данные

<?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>

person Faizal Munna    schedule 05.02.2017    source источник
comment
Для SearchView вам нужно установить OnQueryTextListener и вызвать фильтр адаптера. У меня есть блог о ListView: programandroidlistview.blogspot.com Взгляните на пример простого адаптера, который показывает как вызвать фильтр при изменении текста, образец для адаптера массива, который показывает, как создать собственный фильтр. Надеюсь на помощь!   -  person i_A_mok    schedule 09.02.2017
comment
@I_A_Mok привет, я проверил ваш блог и попробовал ваш код ... слишком много кода внутри вашего адаптера, я не смог найти там представление поиска, не могли бы вы предоставить и ответить на мою проблему   -  person Faizal Munna    schedule 11.02.2017
comment
Судя по вашему опубликованному коду, я думаю, что вы уже создали SearchView и onQueryTextChange(), кажется, работает [Вы можете добавить сообщение в журнал и проверить]. Поэтому проблема, скорее всего, связана с вашим адаптером, которому может потребоваться специальный фильтр. Если возможно, также опубликуйте свой адаптер и класс ParseObject.   -  person i_A_mok    schedule 13.02.2017
comment
спасибо @I_A_Mok, я обновил файл адаптера, я проверил добавление сообщения журнала, он говорит null, и я не могу найти ошибку. Я попытался добавить фильтр к адаптеру, он выдает больше ошибок. .. пожалуйста, проверьте ,,   -  person Faizal Munna    schedule 13.02.2017


Ответы (3)


Попробуйте этот код адаптера:

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);
}
}

И Индивидуальные.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());
    }
}
}
person i_A_mok    schedule 14.02.2017
comment
привет спасибо, код работает без ошибок, но поиск все еще не работает - person Faizal Munna; 14.02.2017
comment
Обновил ответ! Я не заметил, что ваш список mOrganization вначале пуст и позже обновляется в фоновом режиме, теперь внутри адаптера создан метод для обновления списка резервных копий. С другой стороны, убедитесь, что вы обновляете правильный файл кода адаптера. В вашем опубликованном коде конструктор адаптера принимает 3 аргумента, но во фрагменте есть только 2 аргумента. - person i_A_mok; 15.02.2017
comment
хорошо, я забыл удалить, теперь работает хорошо, спасибо :) @I_A_Mok - person Faizal Munna; 15.02.2017
comment
привет stackoverflow.com/questions/42327056/ можете ли вы проверить это, пожалуйста - person Faizal Munna; 19.02.2017
comment
привет @I_A_Mok stackoverflow.com/questions/42968587/ проверьте, можете ли вы - person Faizal Munna; 28.03.2017

создать переменную класса для просмотра

  View view;

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

используйте это для поиска

 SearchView searchView = (SearchView)view.findViewById(R.id.searchTextView);

Эту схему можно использовать.

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:weightSum="1"
    android:layout_height="match_parent">

    <TextView android:id="@id/android:empty"
        android:text="No data"
        android:layout_width="match_parent"
        android:layout_weight="0.1"
        android:layout_height="0dp"
        tools:ignore="HardcodedText" />

    <SearchView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.1"
        android:id="@+id/searchUserTextField"
        android:background="@android:color/holo_red_dark"
        android:textColor="@android:color/white"
        android:textSize="14sp"
        android:hint="Search by Name or Company"
        android:textColorHint="#fff" />

    <ListView android:id="@id/android:list"
        android:layout_width="match_parent"
        android:layout_weight="0.6"
        android:layout_height="wrap_content"
        />

    <ImageView
        android:id="@+id/imageView7"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_weight="0.2"
        android:src="@mipmap/ic_launcher"/>

</LinearLayout>
person santosh kumar    schedule 05.02.2017
comment
Комментарии не для расширенного обсуждения; этот разговор был перемещен в чат. - person Bhargav Rao; 07.02.2017

я думаю проблема здесь:

SearchView searchView = (SearchView)view.findViewById(R.id.searchTextView);
    view=inflater.inflate(R.layout.individuals, container, false);

вы вызываете searchview перед созданием представления

person Jins Lukose    schedule 09.02.2017
comment
спасибо. Можете ли вы сказать мне, как добавить SearchView для просмотра списка - person Faizal Munna; 09.02.2017
comment
Я получаю данные с сервера синтаксического анализа через адаптер, я попадаю в список, мне нужно добавить представление поиска в представление lsit, без представления поиска, которое работает, я думаю, что мой код представления поиска совершенно неверен. не могли бы вы помочь мне добавить поиск - person Faizal Munna; 09.02.2017
comment
blog.nkdroidsolutions.com/ попробуйте это - person Jins Lukose; 09.02.2017
comment
это активность, а моя - фрагмент, поэтому нужно связать список и выполнить поиск каким-то образом, этот метод невозможен. Я старался - person Faizal Munna; 10.02.2017
comment
пожалуйста, проверьте это, если вы можете stackoverflow.com/questions/42327056/ - person Faizal Munna; 19.02.2017