2017-12-31 4 views
0

안녕하세요 저는 listview 항목에 다음 코드를 구현하려고했습니다. https://www.androidhive.info/2012/09/android-adding-search-functionality-to-listview/,하지만 getfilter 해결할 수 없습니다. 대부분 myappadaptor에는 getfilter 메소드가 없습니다.android myappadaptor filter for listview

나는 이것에 대해 올바른 방법을 택할 것인가 아니면 다른 접근 방식을 택해야 할 것인가.

덕분에 여기

inputSearch.addTextChangedListener(new TextWatcher() { 

    @Override 
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
    // When user changed the Text 
    ScaleSelect.this.myAppAdapter.getFilter().filter(cs); 
    } 

    @Override 
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
    } 

    @Override 
    public void afterTextChanged(Editable arg0) { 
    } 
}); 

내 코드 지금까지

> package com.dmh.trent.scale_checker; 
> 
> import android.annotation.SuppressLint; import 
> android.app.ProgressDialog; import android.content.Context; import 
> android.content.Intent; import android.os.AsyncTask; import 
> android.support.v7.app.AppCompatActivity; import android.os.Bundle; 
> import android.view.LayoutInflater; import android.view.View; import 
> android.view.ViewGroup; import android.widget.BaseAdapter; import 
> android.widget.EditText; import android.widget.ListView; import 
> android.widget.TextView; import android.widget.Toast; import 
> java.io.PrintWriter; import java.io.StringWriter; import 
> java.io.Writer; import java.sql.Connection; import 
> java.sql.DriverManager; import java.sql.ResultSet; import 
> java.sql.Statement; import java.util.ArrayList; import java.util.List; 
> import android.text.Editable; import android.text.TextWatcher; 
> 
> 
> public class ScaleSelect extends AppCompatActivity { 
> 
>  private ArrayList<ClassListItems> itemArrayList; //List items Array 
>  private MyAppAdapter myAppAdapter; //Array Adapter 
>  private ListView listView; // ListView 
>  private boolean success = false; // boolean 
> 
>  @Override 
>  protected void onCreate(Bundle savedInstanceState) { 
>   super.onCreate(savedInstanceState); 
>   setContentView(R.layout.scale_select); 
>   listView = findViewById(R.id.listView); //ListView Declaration 
>   itemArrayList = new ArrayList<>(); // Arraylist Initialization 
>   EditText inputSearch = findViewById(R.id.sitefiltertext); 
> 
>   // Calling Async Task 
>   SyncData orderData = new SyncData(); 
>   orderData.execute(""); 
> 
> 
>   inputSearch.addTextChangedListener(new TextWatcher() { 
> 
>    @Override 
>    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
>     // When user changed the Text 
>     ScaleSelect.this.myAppAdapter.getFilter().filter(cs); 
>    } 
> 
>    @Override 
>    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
>           int arg3) { 
> 
> 
>    } 
> 
>    @Override 
>    public void afterTextChanged(Editable arg0) { 
> 
>    } 
>   }); 
> 
>  } 
> 
>  // Async Task has three overrided methods, 
>  @SuppressLint("StaticFieldLeak") 
>  private class SyncData extends AsyncTask<String, String, String> { 
>   String msg = "Internet/DB_Credentials/Windows_FireWall_TurnOn Error, See Android Monitor in the bottom For details!"; 
>   ProgressDialog progress; 
> 
>   @Override 
>   protected void onPreExecute() //Starts the progress dailog 
>   { 
>    progress = ProgressDialog.show(ScaleSelect.this, "Synchronising", 
>      "ListView Loading! Please Wait...", true); 
>   } 
> 
>   @Override 
>   protected String doInBackground(String... strings) // Connect to the database, write query and add items to array list 
>   { 
>    try { 
>     Class.forName("com.mysql.jdbc.Driver"); 
>     Connection conn = DriverManager.getConnection(Appconfig.connectionString, 
> Appconfig.db_user, Appconfig.db_pass); //Connection Object 
>     if (conn == null) { 
>      success = false; 
>     } else { 
>      // Change below query according to your own database. 
>      String query = "SELECT companyname, companystreetname FROM site"; 
>      Statement stmt = conn.createStatement(); 
>      ResultSet rs = stmt.executeQuery(query); 
>      if (rs != null) // if resultset not null, I add items to itemArraylist using class created 
>      { 
>       while (rs.next()) { 
>        try { 
>         itemArrayList.add(new ClassListItems(rs.getString("companyname"))); 
>        } catch (Exception ex) { 
>         ex.printStackTrace(); 
>        } 
>       } 
>       msg = "Found"; 
>       success = true; 
>      } else { 
>       msg = "No Data found!"; 
>       success = false; 
>      } 
>     } 
>    } catch (Exception e) { 
>     e.printStackTrace(); 
>     Writer writer = new StringWriter(); 
>     e.printStackTrace(new PrintWriter(writer)); 
>     msg = writer.toString(); 
>     success = false; 
>    } 
>    return msg; 
>   } 
> 
>   @Override 
>   protected void onPostExecute(String msg) // disimissing progress dialoge, showing error and setting up my ListView 
>   { 
>    progress.dismiss(); 
>    Toast.makeText(ScaleSelect.this, msg + "", Toast.LENGTH_LONG).show(); 
>    if (!success) { 
>    } else { 
>     try { 
>      myAppAdapter = new MyAppAdapter(itemArrayList, ScaleSelect.this); 
>      listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
>      listView.setAdapter(myAppAdapter); 
>     } catch (Exception ignored) { 
> 
>     } 
> 
>    } 
>   } 
>  } 
> 
>  public class MyAppAdapter extends BaseAdapter   //has a class viewholder which holds 
>  { 
>   class ViewHolder { 
>    TextView textName; 
>   } 
> 
>   List<ClassListItems> parkingList; 
> 
>   Context context; 
>   ArrayList<ClassListItems> arraylist; 
> 
>   private MyAppAdapter(List<ClassListItems> apps, Context context) { 
>    this.parkingList = apps; 
>    this.context = context; 
>    arraylist = new ArrayList<>(); 
>    arraylist.addAll(parkingList); 
>   } 
> 
>   @Override 
>   public int getCount() { 
>    return parkingList.size(); 
>   } 
> 
>   @Override 
>   public Object getItem(int position) { 
>    return position; 
>   } 
> 
>   @Override 
>   public long getItemId(int position) { 
>    return position; 
>   } 
> 
>   @SuppressLint("SetTextI18n") 
>   @Override 
>   public View getView(final int position, View convertView, ViewGroup parent) // inflating the layout and initializing widgets 
>   { 
> 
>    View rowView = convertView; 
>    ViewHolder viewHolder = null; 
>    if (rowView == null) { 
>     LayoutInflater inflater = getLayoutInflater(); 
>     rowView = inflater.inflate(R.layout.list_content, parent, false); 
>     viewHolder = new ViewHolder(); 
>     viewHolder.textName = rowView.findViewById(R.id.textName); 
>     rowView.setTag(viewHolder); 
>    } else { 
>     viewHolder = (ViewHolder) convertView.getTag(); 
>    } 
>    // here setting up names and images 
>    viewHolder.textName.setText(parkingList.get(position).getName() + ""); 
> 
>    return rowView; 
>   } 
>  } 

내 XML입니다

> <?xml version="1.0" encoding="utf-8"?> 
> <android.support.constraint.ConstraintLayout 
> 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="com.dmh.trent.scale_checker.ScaleSelect"> 
> 
>  <Button 
>   android:id="@+id/mainmenubuttun" 
>   android:layout_width="200dp" 
>   android:layout_height="wrap_content" 
>   android:layout_marginBottom="40dp" 
>   android:layout_marginEnd="200dp" 
>   android:onClick="mainmenubutton" 
>   android:text="@string/mainmenu" 
>   app:layout_constraintBottom_toBottomOf="parent" 
>   app:layout_constraintRight_toRightOf="parent" /> 
> 
>  <ListView 
>   android:id="@+id/listView" 
>   android:layout_width="290dp" 
>   android:layout_height="241dp" 
>   android:layout_marginStart="44dp" 
>   android:layout_marginTop="40dp" 
>   android:scrollbars="vertical" 
>   app:layout_constraintStart_toStartOf="parent" 
>   app:layout_constraintTop_toBottomOf="@+id/sitefiltertext" /> 
> 
>  <EditText 
>   android:id="@+id/sitefiltertext" 
>   android:layout_width="289dp" 
>   android:layout_height="wrap_content" 
>   android:layout_marginStart="44dp" 
>   android:layout_marginTop="40dp" 
>   android:ems="10" 
>   android:hint="@string/Search" 
>   android:inputType="textPersonName" 
>   app:layout_constraintStart_toStartOf="parent" 
>   app:layout_constraintTop_toTopOf="parent" /> </android.support.constraint.ConstraintLayout> 

답변

0

나는 방법에 대해를 해결하는 것이 아니면 내가 복용해야나요 다른 접근 방식입니다.

ListView를 사용하지 않는 것이 좋습니다. 왜냐하면 지금은 더 이상 사용되지 않기 때문입니다. 대신 RecyclerView을 사용하십시오.

public void updateList(List<DataHolder> list){ 
    currentList = list; 
    notifyDataSetChanged(); 
} 
:
searchField.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
    } 

    @Override 
    public void afterTextChanged(Editable s) { 
     // filter your list from your input 
     filter(s.toString()); 
    } 
}); 



void filter(String text){ 
    List<DataHolder> temp = new ArrayList(); 
    for(DataHolder d: displayedList){ 
      //or use .equal(text) with you want equal match 
      //use .toLowerCase() for better matches 
      if(d.getEnglish().contains(text)){ 
       temp.add(d); 
      } 
    } 
    //update recyclerview Adapter with new List 
    adapter.updateList(temp); 
} 

그리고 RecyclerView의 어댑터

당신이 updateList에게 방법이있을 것이다 : 그것은 어댑터의 사용하면이처럼 활동 또는 Fragnent에서 목록을 필터링 할 수 있습니다