recyclerView setText Position - PullRequest
       0

recyclerView setText Position

0 голосов
/ 05 декабря 2018

Я работаю над проектом Android, в котором я настроил cardView внутри recyclerView, где мне нужно иметь возможность установить текст выбранного cardView.

В настоящее время это работает:

Добавление CardView: Нажмите 3-точечное изображение (при просмотре карты) -> Нажмите в меню (Добавить просмотр карты) -> (Появится диалоговое окно оповещения).) введите текст -> добавлен новый вид карты и название, которое вы написали.Работает с позицией.

Удалить CardView: Нажмите 3-точечное изображение (при просмотре карты) -> Нажмите в меню (Удалить просмотр карты) -> выбранное просмотр карты удалит.Работает с позицией.

Изменить текст CardView: ЭТО НЕ РАБОТАЕТ.Мне нужна помощь, чтобы изменить текст на выбранной карте.Я могу настроить диалоговое окно с предупреждением для ввода текста, но как мне изменить текст выбранного просмотра карты?

Важная информация: changeLokation (вызывается в коде, в случае переключения), где яхочу изменить текст cardView.

Перевод меню:

  • Изменить текст = navndre navn
  • Добавить датчики в Location = Tilføj Sensor to Lokation (В настоящее время недоступно).

  • Добавить CardView = Добавить CardView

  • Удалить CardView = Удалить CardView

Я ценю любую помощь.Заранее спасибо!

enter image description here

КОД КАК СЛЕДУЮЩИЙ:

public class lokationRecyclerAdapter extends RecyclerView.Adapter<lokationRecyclerAdapter.RecyclerViewHolder> {

List<String> cardList;
String test;

public lokationRecyclerAdapter(List<String> cardList) {
    this.cardList = cardList;
    notifyDataSetChanged();
}

@Override
public RecyclerViewHolder onCreateViewHolder(final ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from( viewGroup.getContext() ).inflate( R.layout.lokationcardview, viewGroup, false );
    return new RecyclerViewHolder( view );
}

public void deleteItem(int position) {
    cardList.remove( position );
    notifyItemRemoved( position );
    notifyItemRangeChanged( position, cardList.size() );

}

@Override
public void onBindViewHolder(RecyclerViewHolder recyclerViewHolder, int position) {
    recyclerViewHolder.cardView.setBackgroundResource( R.drawable.ic_circleshape );
    recyclerViewHolder.lokationsName.setText( cardList.get( position ) );
}

@Override
public int getItemCount() {
    return cardList.size();
}

class RecyclerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    public int nummer;
    private CardView cardView;
    private Button menuButton;
    private TextView lokationsName;

    public void alertDialog(final View itemView) {

        new AlertDialog.Builder( itemView.getContext() );

        android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder( itemView.getContext() );
        builder.setCancelable( true );
        builder.setTitle( "Tilføj eller ændre navnet på lokation" );
        builder.setMessage( "Hold styr på dine sensorer ved at oprette lokationer i form af eksempelvis lokaler." );

        final EditText input = new EditText( itemView.getContext() );
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT );
        input.setMaxLines( 1 );
        input.setInputType( InputType.TYPE_CLASS_TEXT );
        input.setLayoutParams( lp );
        builder.setView( input );

        builder.setPositiveButton( "Ja", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {    
                test = input.getText().toString();
                cardList.add( test );
                //lokationsName.setText( test );
                System.out.println( "TEST: " + cardList );
            }
        } );

        builder.setNegativeButton( "Nej", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        } );
        android.support.v7.app.AlertDialog dialog = builder.create();
        dialog.show();
    }

    public RecyclerViewHolder(final View itemView) {
        super( itemView );

        cardView = (CardView) itemView.findViewById( R.id.lokationcard_view );
        menuButton = (Button) itemView.findViewById( R.id.menuButton );
        lokationsName = (TextView) itemView.findViewById( R.id.lokationsName );

        itemView.setOnClickListener( this );

        menuButton.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                final PopupMenu popupMenu = new PopupMenu( itemView.getContext(), menuButton );
                popupMenu.getMenuInflater().inflate( R.menu.lokationpopmenu, popupMenu.getMenu() );

                popupMenu.setOnMenuItemClickListener( new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {

                        switch (item.getItemId()) {

                            case R.id.changeLokation:
                                System.out.println( "GET ADAPTER POSITION: " + getAdapterPosition() + " CARD LIST: " + cardList );
                                alertDialog( itemView );
                                break;

                            case R.id.addCardView:
                                String lokation = lokationsName.getText().toString();

                                /*if (lokation.equals( "TILFØJ LOKATION" )) {
                                    Toast.makeText( itemView.getContext(), "Du skal ændre navnet på lokation først!", Toast.LENGTH_LONG ).show();
                                } else {*/
                                System.out.println( "GET ADAPTER POSITION: " + getAdapterPosition() );
                                //addItem(getAdapterPosition());
                                alertDialog( itemView );
                                System.out.println( "LOKATIONS NAME: " + lokation + " CARDLIST: " + cardList );
                                // }
                                break;

                            case R.id.deleteCardView:
                                if (cardList.size() > 1) {
                                    deleteItem( getAdapterPosition() );
                                } else {
                                    Toast.makeText( itemView.getContext(), "Du kan ikke slette den sidste CardView", Toast.LENGTH_LONG ).show();
                                }
                                break;

                        }
                        return true;
                    }
                } );
                popupMenu.show();
            }
        } );

    }

    }

}

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Из вашего кода я вижу, что вы пытаетесь обновить lokationsName.setText( test ); непосредственно из текста диалога, я бы не рекомендовал делать это таким образом, вам следует обновить свое значение до вашего списка и вызвать notifyitemchanged.

Пример:

Передайте позицию элемента здесь, вам это понадобится для обновления вашего элемента

public void alertDialog(final View itemView,int position) {

        new AlertDialog.Builder( itemView.getContext() );

        android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder( itemView.getContext() );
        builder.setCancelable( true );
        builder.setTitle( "Tilføj eller ændre navnet på lokation" );
        builder.setMessage( "Hold styr på dine sensorer ved at oprette lokationer i form af eksempelvis lokaler." );

        final EditText input = new EditText( itemView.getContext() );
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT );
        input.setMaxLines( 1 );
        input.setInputType( InputType.TYPE_CLASS_TEXT );
        input.setLayoutParams( lp );
        builder.setView( input );

        builder.setPositiveButton( "Ja", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {    
                test = input.getText().toString();
                //change the code here
                cardList.set(position,test);
                notifyItemChanged(position); 
            }
        } );

        builder.setNegativeButton( "Nej", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        } );
        android.support.v7.app.AlertDialog dialog = builder.create();
        dialog.show();
    }

И в вашем RecyclerViewHolder измените следующее:

public RecyclerViewHolder(final View itemView) {
        super( itemView );

        cardView = (CardView) itemView.findViewById( R.id.lokationcard_view );
        menuButton = (Button) itemView.findViewById( R.id.menuButton );
        lokationsName = (TextView) itemView.findViewById( R.id.lokationsName );
        //add this line here
        lokationsName.setText(cardList.get(getAdapterPosition()));

    }

Дайте мне знать в комментариях, если есть какие-либо вопросы.

0 голосов
/ 05 декабря 2018

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

array[2] = "new text";
adapter.notifyItemChanged(2);

Эта фундаментальная концепция верна независимо от того, как изменяются ваши данные,Если вы вставляете или удаляете значения или даже сбрасываете весь набор данных, вы сначала изменяете данные, а затем уведомляете адаптер (с помощью notifyItemInserted(), notifyItemRemoved() или notifyDataSetChanged()).

В вашем случаевместо того, чтобы передавать представление в ваш метод alertDialog(), вы должны передать позицию адаптера этого представления:

case R.id.changeLokation:
    alertDialog(getAdapterPosition());
    break;

Затем, как только пользователь введет текст и нажмет кнопку ОК, вы возьмете новыйтекст и поменять его в свой список:

cardList.remove(position); // this is the argument passed into alertDialog()
cardList.add(position, newText);

И, наконец, вы уведомите адаптер:

adapter.notifyItemChanged(position);
0 голосов
/ 05 декабря 2018

Я думаю, это потому, что вы выполняете setText асинхронно, поэтому у вас больше нет доступа к вашему представлению.

Я бы попробовал сделать это на вашем recyclerView myRecyclerView.findViewHolderForAdapterPosition(pos);, затем измените текст с помощьюправильный viewHolder.

Обратите внимание, что если представление было переработано, оно вернет null

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...