Элемент отфильтрованного списка открывает активность исходных элементов списка.

После огромного количества времени поиска здесь и везде я безнадежен найти решение.

Итак, вот моя проблема.

Я создал представление списка и добавил панель поиска.

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

Я с нетерпением жду вашей помощи, ребята; потому что мне это нужно!


person Community    schedule 19.09.2015    source источник
comment
серьезно, это вопрос Тасос, название?   -  person    schedule 19.09.2015
comment
Вы не можете запустить другую базу действий на позиции в вашем случае, поэтому попробуйте открыть другую базу действий на выбранном элементе с какой-то уникальной идентификацией.   -  person Haresh Chhelana    schedule 22.09.2015
comment
Привет, Хареш, не мог бы ты подробнее рассказать о том, что ты сказал? На каком-то примере?   -  person    schedule 23.09.2015


Ответы (4)


public class Group extends ListActivity {

 // ArrayList thats going to hold the search results
ArrayList<HashMap<String, Object>> searchResults;

 // ArrayList that will hold the original Data
ArrayList<HashMap<String, Object>> originalValues;
LayoutInflater inflater;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.grouplist);
final EditText searchBox = (EditText) findViewById(R.id.searchBox);
ListView playersListView = (ListView) findViewById(android.R.id.list);


inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

final EditText searchBox = (EditText) findViewById(R.id.searchBox);
ListView playersListView = (ListView) findViewById(android.R.id.list);

inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

// these arrays are just the data that
// I'll be using to populate the ArrayList
String names[] = {/*list of names*/ };
String teams[] = {/*list of teams*/};
Integer[] photos = {R.drawable.... /*list of drawables*/};
Integer[] id ={/*Position*/};

 originalValues = new ArrayList<HashMap<String, Object>>();

// temporary HashMap for populating the Items in the ListView
HashMap<String, Object> temp;

// total number of rows in the ListView
int noOfPlayers = names.length;

// now populate the ArrayList players
for (int i = 0; i < noOfPlayers; i++) {
temp = new HashMap<String, Object>();

temp.put("name", names[i]);
temp.put("team", teams[i]);
temp.put("photo", photos[i]);
temp.put("id", id[i]);

// add the row to the ArrayList
    originalValues.add(temp);
 }
    // searchResults=OriginalValues initially
  searchResults = new ArrayList<HashMap<String, Object>>(originalValues);

final CustomAdapter adapter = new CustomAdapter(this, R.layout.players, searchResults);

 // finally,set the adapter to the default ListView
playersListView.setAdapter(adapter);
searchBox.addTextChangedListener(new TextWatcher() {


public void onTextChanged(CharSequence s, int start, int before, int count) {
    // get the text in the EditText
    String searchString = searchBox.getText().toString();
    int textLength = searchString.length();

    // clear the initial data set
    searchResults.clear();

    for (int i = 0; i < originalValues.size(); i++) {
        String playerName = originalValues.get(i).get("name").toString();
        if (textLength <= playerName.length()) {
            // compare the String in EditText with Names in the
            // ArrayList
            if (searchString.equalsIgnoreCase(playerName.substring(0, textLength)))
                searchResults.add(originalValues.get(i));
        }
    }

    adapter.notifyDataSetChanged();
}

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

}

public void afterTextChanged(Editable s) {

}
});


// listening to single list item on click
    playersListView.setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView<?> parent, View view,      int position, long id) {

        int pos=Integer.ParseInt(searchResults.get(position).get("id").toString());
             switch (pos) {
              case 0:
               Intent newActivity = new Intent(TeamsList.this, Barca.class);
               startActivity(newActivity);
               break;
              case 1:
               etc...
             }
       }
    }
 });

}

Пользовательский класс адаптера:

private class CustomAdapter extends ArrayAdapter<HashMap<String, Object>> {

public CustomAdapter(Context context, int textViewResourceId, ArrayList<HashMap<String, Object>> Strings) {

// let android do the initializing :)
super(context, textViewResourceId, Strings);
}

// class for caching the views in a row
private class ViewHolder {
ImageView photo;
TextView name, team;

}

ViewHolder viewHolder;

@Override
public View getView(int position, View convertView, ViewGroup parent) {

if (convertView == null) {
    convertView = inflater.inflate(R.layout.players, null);
    viewHolder = new ViewHolder();

    // cache the views
    viewHolder.photo = (ImageView) convertView.findViewById(R.id.photo);
    viewHolder.name = (TextView) convertView.findViewById(R.id.name);
    viewHolder.team = (TextView) convertView.findViewById(R.id.team);

    //Take one textview in listview design named id
    viewHolder.id = (TextView) convertView.findViewById(R.id.id);


    // link the cached views to the convert view
    convertView.setTag(viewHolder);

  } else 
    viewHolder = (ViewHolder) convertView.getTag();

 int photoId = (Integer) searchResults.get(position).get("photo");

 // set the data to be displayed
viewHolder.photo.setImageDrawable(getResources().getDrawable(photoId));
viewHolder.name.setText(searchResults.get(position).get("name").toString());
viewHolder.team.setText(searchResults.get(position).get("team").toString());
viewHolder.id.setText(searchResults.get(position).get("id").toString());


// return the view to be displayed
return convertView;

    }
  }
}
person akhil batlawala    schedule 19.09.2015
comment
Я что-то меняю в вашем коде. Надеюсь, что это работает. Это легко сделать, когда вы используете сущность для установки данных в текстовых представлениях. - person akhil batlawala; 19.09.2015
comment
Спасибо за ваши ответы! :-)По вашему предложению я расширил строку Integer[] id ={/*Position*/}; со всеми моими R.layouts (если я ошибаюсь, пожалуйста, дайте мне 1/2-строчный пример того, как это сделать). Как только я сохраняю чистый проект, я получаю следующие ошибки: 1) Несколько маркеров в этой строке - идентификатор не может быть разрешен или не является полем в строке кода: // Возьмите одно текстовое представление в дизайне списка с именем id viewHolder.id = (TextView) convertView.findViewById(R.id.id); и 2) идентификатор не может быть разрешен или не является полем, в viewHolder.id.setText(searchResults.get(position).get(id).toString()); - person ; 20.09.2015
comment
фото изображения; Имя TextView, команда, идентификатор; Объявите идентификатор в просмотрщике, как это - person akhil batlawala; 21.09.2015
comment
Привет, Ахил, когда я делаю, как ты говоришь, это действительно решает проблемы. Однако остается только одна вещь, которая находится в следующей строке: viewHolder.id = (TextView) convertView.findViewById(R.id.id); Ошибка: идентификатор не может быть разрешен или не является полем ... ошибка в файлах xml (я также включил файлы xml выше)? Спасибо еще раз - person ; 21.09.2015
comment
ага, перепробовал все что советовали, ничего не помогает - person ; 15.10.2015

Я думаю, вы не можете найти правильную позицию при щелчке элемента списка. поэтому вы можете использовать одно текстовое представление с видимостью = "Ушел" и вставлять позицию в это текстовое представление в каждую строку. теперь вы можете легко получить доступ к положению, щелкнув элемент со значением textview, которое показывает идеальное положение. Надеюсь, что это работает. спасибо

person akhil batlawala    schedule 19.09.2015
comment
viewHolder.id = (TextView) convertView.findViewById(R.id.id); добавьте одно текстовое представление в средство просмотра и установите текст этого текстового представления в позицию. Я думаю, это работает. - person akhil batlawala; 19.09.2015
comment
Во-первых, вы правы, это моя проблема. Кроме того, если не слишком много вопросов, не могли бы вы показать мне, как это сделать в конкретном коде выше, потому что я несколько дней пытаюсь найти решение и чувствую себя безнадежным прямо сейчас. Я благодарю вас и приношу свои извинения за все проблемы - person ; 19.09.2015

Проблема в том, что адаптер заполняется один раз, но с результатами поиска он перекрывается искомыми элементами, поэтому при нажатии на него один раз ссылаются на исходные элементы списка, а не на отфильтрованный список, поэтому мы должны использовать позиции отфильтрованных списков вместо оригинальный, я тоже столкнулся с этой проблемой, попробуйте это:

В вашем listView.setOnItemClickListener

playersListView.setOnItemClickListener(new OnItemClickListener() {
 public void onItemClick(AdapterView<?> parent, View view,int position, long id) {

    //Object objFilteredItem = parent.getItemAtPosition(position);
    //String a = searchResults.get(position);

    switch (Integer.parseInt((String) adapter.getItem(position))) {
    case 0:..
     Intent newActivity = new Intent(TeamsList.this,Barca.class);
     startActivity(newActivity);
     break;

    case 1:
     etc...
     break;
   }
 } 
});
person mfaisalhyder    schedule 19.09.2015

Как и в моем предыдущем ответе на вопрос здесь, вам необходимо переопределить метод getItem(position) в файле CustomAdapter. Вы устанавливаете onItemClick несколько правильно, но адаптер списка не знает, что именно он получает от getItem(position).

РЕДАКТИРОВАНИЕ (подробности): вам нужно добавить что-то подобное в свой собственный адаптер -

@Override
public Object getItem(int position) {
    return list.get(position);
}

У вас уже должен быть list в вашем пользовательском адаптере. Если нет, вы можете добавить ссылку на список к вашему CustomAdapter:

private ArrayList<HashMap<String, Object>> list;

Затем установите его с помощью установщика в вашей деятельности Group:

customAdapter.setList(searchResults);
person Sudhanshu    schedule 21.09.2015
comment
Также, @justarandomguy, вы, возможно, захотите пересмотреть использование ArrayAdapter. Прочтите: stackoverflow. ком/вопросы/11650121/ - person Sudhanshu; 22.09.2015