1

Я пытаюсь создать пользовательский интерфейс, похожий на Google Keep. Я знаю, как создать пошаговое представление с использованием вида Recycler. Если я нажму конкретную Карту. Затем он должен открыть действие.Recycler View Onclick метод в действии?

я могу достичь этого using onclick method.

Этот же сценарий происходит в по крайней мере 5 различных видов деятельности в моем приложении.

Мой вопрос заключается в том, что

  1. Могу ли я использовать этот единственный адаптер во всех этих 5 мест?

    1. Если да, то где я должен размещать действия onclick?

    2. Если нет, то как я могу создать шахматный макет, например Keep?

Заранее спасибо!

+0

Я смущен, когда вы застреваете. Ссылка, которую вы указали, показывает, как делать то, что вы хотите сделать. Так что, может быть, вопрос непонятен. – NoChinDeluxe

+1

Если я использую метод Onclick в моем адаптере. Оно работает. Затем для другого действия я должен создать другой адаптер. Так что требуется 5 адаптеров и больше. Это хорошая практика? – user3467240

+0

Если это те же данные, которые вы будете представлять во всех пяти действиях, вы можете использовать тот же самый адаптер. Но зачем вы это делаете. Вместо этого вы можете выполнять однопользовательскую операцию и иметь кнопки для изменения вида. – cgr

ответ

-1

(См приложения для RecyclerView ниже в правках)

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

Но если некоторые из ваших Деяний использовали аналогичные данные в их ListViews - возможно, например, два TextViews и ImageButton - вы могли бы сэкономить некоторое время, указав один адаптер, который можно использовать для нескольких видов деятельности. Затем вы создавали отдельные объекты для каждой операции, подобно тому, как вы создавали бы несколько объектов ArrayAdapter<String> для заполнения нескольких списков ListView.

BaseAdapter - отличный класс для расширения пользовательского адаптера. Он является гибким и позволяет вам полностью контролировать данные, которые отображаются в вашем ListView. Вот минимальный пример:

public class CustomBaseAdapter extends BaseAdapter { 

    private Context context; 
    private ArrayList<String> listData; 

    public CustomBaseAdapter(Context context, ArrayList<String> listData) { 
     this.context = context; 
     this.listData = listData; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if(convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.your_list_item_layout, parent, false); 

      //populate the view with your data -- some examples... 
      TextView textData = (TextView) convertView.findViewById(R.id.yourTextView); 
      textData.setText(listData.get(position)); 

      ImageButton button = (ImageButton) convertView.findViewById(R.id.yourImageButton); 
      button.setOnClickListener(new View.OnClickListener() { 
       //... 
       //... 
      }); 
     } 

     return convertView; 
    } 

    @Override 
    public Object getItem(int position) { 
     return 0; 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public int getCount() { 
     return listData.size(); 
    } 
} 

Так ключевая часть этого кода, очевидно, getView() метод, который вызывается каждый раз, когда ListView нужно какие-то данные для отображения. Для эффективности представления хранятся в виде, называемом convertView, поэтому их можно повторно использовать и не нужно накачивать каждый раз, когда на экране появляется представление.

Итак, что мы делаем в getView(), сначала выясните, существует ли convertView. Если это так, мы просто передаем это обратно в вызывающий ListView, потому что все уже должно быть создано и готово к работе. Если convertView имеет значение NULL, это означает, что данные не были созданы (или должны быть повторно созданы по какой-либо причине), и поэтому мы раздуваем совершенно новое представление и заполняем его нашими данными.

Таким образом, в случае с приведенным выше примером адаптера, если некоторые из ваших Деяний отображают один список строк, вы можете повторно использовать этот адаптер для каждого из них, передавая в другом ArrayList<String> через конструктор каждый раз, когда вы создали новый объект. Но, очевидно, вы могли бы передать больше, чем просто Strings, если бы у вас было больше данных для показа. Уровень сложности зависит от вас.И если разница между вашими действиями была слишком велика, я бы просто создал пользовательские версии этого класса для всех из них и просто создавал их и заполнял их, как вам хотелось бы. Он будет держать все ваши данные очень организованными и инкапсулированными.

Надеюсь, это поможет! Не стесняйтесь задавать вопросы, если вам это нужно.


EDIT в ответ на комментарии

Поскольку вы используете RecyclerView вместо обычного ListViews (который я, по некоторым причинам, совсем забыл) еще можно было сделать что-то очень похожее, используя RecyclerView.Adapter<YourViewHolder> вместо. Разница заключалась бы в том, что вместо того, чтобы раздувать представления в методе getView(), они накапливаются внутри вашего пользовательского ViewHolder, который, как я полагаю, у вас уже есть. Код может выглядеть примерно так:

public class CustomRecyclerViewAdapter extends RecyclerView.Adapter<StringViewHolder> { 

    private final List<String> items; 

    public CustomRecyclerViewAdapter(ArrayList<String> items) { 
     this.items = items; 
    } 

    @Override 
    public StringViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     //So instead of inflating the views here or in a getView() like in 
     //in the BaseAdapter, you would instead inflate them in your custom 
     //ViewHolder. 
     return new StringViewHolder(parent); 
    } 

    @Override 
    public void onBindViewHolder(StringViewHolder holder, int position) { 
     holder.setModel(items.get(position)); 
    } 

    @Override 
    public long getItemId(int position) { 
     return items.get(position).hashCode(); 
    } 

    @Override 
    public int getItemCount() { 
     return items.size(); 
    } 
} 
+0

Вопрос определяет использование 'Recycler View', и вы отвечаете на' List View'. Будьте внимательны при ответе. –

+0

@VipulAsri - Ой, да, вы правы. Я больше пытался показать, как использовать пользовательские адаптеры, а BaseAdapter - один из самых простых. Но вы правы, он должен быть адаптирован для RecyclerView. Я сделаю некоторые изменения, когда у меня появится такая возможность. – NoChinDeluxe

 Смежные вопросы

  • Нет связанных вопросов^_^