Невозможно удалить EditText из строки внутри CursorAdapter

1

В приведенном ниже коде мне удалось заставить EditText функционировать внутри строки. Также удалось заставить кнопку щелкнуть (без щелчка всей строки) и запустить AsyncTask всякий раз, когда происходит щелчок. Код работает хорошо и выполняет эту работу. Однако всякий раз, когда я onPostExecute кнопку, я хочу, чтобы она была удалена в onPostExecute async.

(в приведенном ниже коде я не размещаю viewTag setTag и viewTag. Не viewTag против этого, так как я могу получить, какая строка была нажата, когда была нажата кнопка.) Поэтому, пожалуйста, сосредоточьтесь на том, чтобы сделать EditText невидимым, а не тем.

public class myCursorAdapter extends CursorAdapter
{      
String id;

public myCursorAdapter (Context context, Cursor c, int status)
{
        super(context, c, status);
}

 protected static class RowViewHolder
 {
   public TextView resentTV;
 }

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent)
{
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View retView = inflater.inflate(R.layout.row, parent, false);

        RowViewHolder holder = new RowViewHolder();
        holder.resentTV = (TextView) retView.findViewById(R.id.resendTextViewVIEW);
        holder.resentTV.setOnClickListener(mOnTitleClickListener);

        return retView;
}

 @Override
public void bindView(View vi, Context context, Cursor cursor)
{
        DbAllHelper db = DbAllHelper.getInstance(context);

        TextView nameTV = (TextView) vi.findViewById(R.id.nameTextViewVIEW);
        String name = cursor.getString(cursor.getColumnIndex(cursor.getColumnName(2)));
        nameTV.setText(name);

        TextView resendTV = (TextView) vi.findViewById(R.id.resendTextViewVIEW);
        resendTV.setVisibility(View.GONE);

        String id= cursor.getString(cursor.getColumnIndex(cursor.getColumnName(0)));

}

private OnClickListener mOnTitleClickListener = new OnClickListener()
{
        @Override
        public void onClick(View v)
        {
                new myAsynck().execute(); //does network stuff
        }
};



class MySync extends AsyncTask<String, String, String>
{
    @Override
    protected void onPreExecute()
    {
        super.onPreExecute();
    }

    protected String doInBackground(String... args)
    {   
        //do some network stuff
        return null;
    }

    protected void onPostExecute(String str)
    {
       //problem here
       //remove the EditText of the row that had the button that caused this async to run
    }
}
  • 0
    Вы хотите удалить только EditText или всю строку из адаптера?
  • 0
    Просто этот текст редактирования из этой конкретной строки. Не весь ряд !!
Показать ещё 1 комментарий
Теги:

1 ответ

2
Лучший ответ

Здесь простое решение. Просто создайте немного другую AsyncTask и передайте ей View который вы хотите скрыть после выполнения задачи. В следующей реализации используется WeakReference<View> чтобы избежать возможных утечек:

   class MySync extends AsyncTask<String, String, String>
    {

        WeakReference<View> toHide;

        public MySync(View v){
            super();
            toHide = new WeakReference<View>(v);
        }

        @Override
        protected void onPreExecute()
        {
            super.onPreExecute();
        }

        protected String doInBackground(String... args)
        {   
            //do some network stuff
            return null;
        }

        protected void onPostExecute(String str)
        {
            if(toHide != null && toHide.get() != null)
                toHide.get().setVisibility(View.GONE);
        }
    }

Теперь вызовите вашу новую AsyncTask передающую целевой View:

   @Override
   public void onClick(View v) {
       new myAsynck(v).execute(); //does network stuff
   }

Если вам нужно, чтобы скрыть View, который отличается от целевого View (который, в вашем случае, кнопки), вы можете использовать что - то вроде этого, чтобы найти еще одного ребенка, начиная от родителей:

    ViewGroup vg = ((ViewGroup)toHide.get().getParent());
    View otherView = vg.findViewById(R.id.editText);
    otherView.setVisibility(View.GONE);
  • 0
    Боннис, это сделало меня очень благодарным за твои усилия. Вы не могли бы сделать небольшое объяснение, почему вы использовали слабую ссылку и реализовали этот метод? Спасибо :))
  • 0
    @ tony9099 конечно. Как обычно, я предпочитаю никогда не хранить прямые ссылки на объекты View и Context вне их естественного объема, потому что они часто являются причиной утечек. В этом случае, если AsyncTask где-то создан и никогда не используется, он будет содержать ссылку на View; если AsyncTask работает, когда меняется весь макет (что возможно), ссылка на View не может быть GC-ed и т. д.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню