4

У меня есть ListView с только TextView. Я хочу реализацию, в которой, если я нажму на строку ListView, появится edittext с кнопкой replace, и все, что я наберу в этом edittext, и нажмите «replace», listrow должен обновиться. Моя главная проблема, с которой я сталкиваюсь, заключается в раздувании макета в строке списка. Может кто-нибудь сказать мне, как этого добиться?Замена строки ListView с другим макетом onClick

public class ContextMenuActivity extends Activity { 
    private ListView list; 
    TextView tv; 
    ArrayList<String> alistItems; 
    int loopCount; 
    CustomAdapter adapter; 
    LayoutInflater inflater; 
    TextView textView; 
    EditText edtTextToReplace; 
    RelativeLayout rl_inflate; 
    View child; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.contextmenulist); 
     initComponents(); 
     setActionListener(); 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, 
      ContextMenuInfo menuInfo) { 

     super.onCreateContextMenu(menu, v, menuInfo); 
     menu.setHeaderTitle("Options"); 
     menu.add(0, v.getId(), 0, "Edit"); 
     menu.add(0, v.getId(), 0, "Delete"); 
     /* 
     * MenuInflater inflater = getMenuInflater(); 
     * inflater.inflate(R.menu.context_menu, menu); 
     */ 
    } 



    private void initComponents() { 
     inflater = ContextMenuActivity.this.getLayoutInflater(); 

     list = (ListView) findViewById(R.id.contextmenu_lst_list); 
     tv = (TextView) findViewById(R.id.listitem_txt_item); 
     alistItems = new ArrayList<String>(); 
     for (loopCount = 1; loopCount < 30; loopCount++) { 
      alistItems.add("Item " + loopCount); 
     } 
     prepareView(); 
    } 

    private void prepareView() { 
     adapter = new CustomAdapter(getApplicationContext(), R.layout.listitem, 
       alistItems); 
     list.setAdapter(adapter); 
     registerForContextMenu(list); 
    } 

    private void setActionListener() { 

     list.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, final View view, 
        final int arg2, long arg3) { 
       System.out.println("alist is " + alistItems); 
       textView = (TextView) view.findViewById(R.id.listitem_txt_item); 
       rl_inflate = (RelativeLayout) view 
         .findViewById(R.id.rl_inflate); 
       child = getLayoutInflater().inflate(R.layout.clicklistitem, 
         null); 
       rl_inflate.addView(child); 
       textView.setVisibility(View.GONE); 
       rl_inflate.setVisibility(View.VISIBLE); 
       Button my_btn = (Button) child 
         .findViewById(R.id.clicklistitem_btn_replace); 
       edtTextToReplace = (EditText) child 
         .findViewById(R.id.clicklistitem_edt); 
       my_btn.setOnClickListener(new OnClickListener() { 

        @Override 
        public void onClick(View v) { 
         textView.setText(edtTextToReplace.getText().toString()); 
         alistItems.set(arg2, edtTextToReplace.getText() 
           .toString()); 
         rl_inflate.setVisibility(View.GONE); 
         rl_inflate.removeViewInLayout(child); 
         textView.setVisibility(View.VISIBLE); 
         adapter.notifyDataSetChanged(); 
        } 
       }); 
      } 
     }); 
    } 

    public class CustomAdapter extends ArrayAdapter<String> { 
     ArrayList<String> alistItems; 
     int resource; 

     public CustomAdapter(Context context, int resource, 
       ArrayList<String> alistItems) { 
      super(context, resource); 
      this.alistItems = alistItems; 
      this.resource = resource; 
     } 

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

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      Holder holder = new Holder(); 
      if (convertView == null) { 
       convertView = inflater 
         .inflate(R.layout.listitem, parent, false); 
      } 
      holder.tvRow = (TextView) convertView 
        .findViewById(R.id.listitem_txt_item); 
      convertView.setTag(holder); 
      holder = (Holder) convertView.getTag(); 
      holder.tvRow.setText(alistItems.get(position)); 
      return convertView; 
     } 
    } 

    class Holder { 
     TextView tvRow; 
    } 
} 
+0

Можете ли вы разместить свой код? Тогда только мы можем исправить это. Мы не можем написать весь код. – Gunaseelan

+0

опубликовано ... его обычный список, ничего особенного. –

+0

В вашем listiteme.xml возьмите два макета 1) будет содержать простой текстовый просмотр и 2) будет содержать edittext и кнопку. Второй шаг Kepp ушел изначально, когда пользователь нажимает на элемент, видимый второй макет, и ушел первым макетом. –

ответ

9

Вы можете достичь этого двумя способами: -

  1. Первый в макете элемента управления ListView добавить EditText и кнопки и скрыть их. Теперь установите onItemClickListener списка, в котором скрываются текстовые поля и отображаются кнопки editext и replace.

  2. Во-вторых, создайте новый макет с текстом редактирования и кнопкой и установите onItemClickListener для просмотра списка, а при нажатии на строку вы можете легко раздуть этот макет в макете вашего списка.

второго кода Решение: -

inflate.xml

<EditText 
      android:id="@+id/enter_txt" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
/> 

<Button 
      android:id="@+id/btn_replace" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
/> 

* list_view_item.xml *

<TextView 
      android:id="@+id/my_txt" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="ABCD" 
/> 

<RelativeLayout 
      android:id="@+id/rl_inflate" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
/> 

ListView onItemClickListener

 listView.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 

          TextView txt_view = (TextView)view.findViewById(R.id.my_txt); 

          txt_view.setVisibility(View.GONE); 

         RelativeLayout rl_inflate = (RelativeLayout)view.findViewById(R.id.rl_inflate); 
          View child = getLayoutInflater().inflate(R.layout.inflate); 
          rl_inflate.addView(child); 


          Button my_btn = (Button)child.findViewById(R.id.btn_replace); 
          EditText enter_txt = (EditText)child.findViewById(R.id.enter_txt); 

          my_btn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
           txt_view.setText(enter_txt.getText().toString()); 
           txt_view.setVisibility(View.VISIBLE); 
      } 
      }); 
     } 
    }); 
+0

Как достичь второго? Я создал макет, но не знаю, как его раздуть. –

+0

проверить обновление – amrinder007

+0

да его работа ... lemme проверить это правильно, то примет ваш answer.thnx много. –

0

Вы можете пойти с одним из двух приведенных ниже решений:

  1. Включите EditText и кнопку заменить вместе с макетом TextView и что должно быть в скрытом состоянии. При щелчке по элементу списка измените видимость текста редактирования и кнопку на заметку и измените значение textview на Gone. При нажатии на кнопку замены измените видимость.

  2. При нажатии на элемент списка отобразите окно предупреждения с кнопкой edittext и replace. После изменения содержимого и нажатия на кнопку замены измените содержимое текстового поля на измененное значение.

+0

не может раздуваться другой макет ??? –

+0

нет ... просто скройте редактор и кнопку в том же макете, который содержит текстовое изображение. –

+0

ok Я постараюсь сделать это, а затем вернусь к вам. –

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