2016-04-16 144 views
1

我是編程/ Android的新手,我試圖從DialogFragment窗口編輯listItem後刷新ListView。這裏就是ListView的定義:更改listItem後刷新ListView

public class AnswersList extends AppCompatActivity { 

private ListView mListAnswer; 
private AnswerAdapter mAnswerAdapter; 
private static final String ANSWERS_TO_LISTVIEW = "answers_to_listview"; 
private static final String TAG = "AnswersList"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.list_answers); 

    mAnswerAdapter = new AnswerAdapter(); 

    mListAnswer = (ListView) findViewById(R.id.listView); 

    mListAnswer.setAdapter(mAnswerAdapter); 

    // handle clicks on listview 
    mListAnswer.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

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

      Question tempQuestion = mAnswerAdapter.getItem(whichItem); 

      // create a new dialog window 
      DialogShowAnswer dialog = new DialogShowAnswer(); 
      // send in a reference to the Note to be shown 
      dialog.sendQuestionSelected(tempQuestion); 

      // Show the dialog window with the note in it 
      dialog.show(getSupportFragmentManager(), ""); 

     } 
    }); 


} 

public class AnswerAdapter extends BaseAdapter { 

    ArrayList<Question> mListAnswers = new ArrayList<Question>(); 
    QuestionBank mQuestionBank; 
    Context mContext = getApplicationContext(); 

    public AnswerAdapter() { 
     mQuestionBank = QuestionBank.get(mContext); 
     mListAnswers = mQuestionBank.getAnswers(); 
    } 

    public ArrayList<Question> getListAnswers() { 
     return mListAnswers; 
    } 

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

    @Override 
    public Question getItem(int position) { 
     return mListAnswers.get(position); 
    } 

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

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

     ** A bunch of code here ** 

     return convertView; 
    } 

    public void updateList() { 
     mListAnswers = mQuestionBank.getAnswers(); 
     notifyDataSetChanged(); 
    } 


} 


} 

下面是對話窗口中的代碼:

public class DialogShowAnswer extends DialogFragment { 

private Question mQuestion; 
private static final String KEY_INDEX = "index"; 
private static final String TAG = "DialogShowAnswer"; 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 

    if(savedInstanceState != null) { 
     mQuestion = savedInstanceState.getParcelable(KEY_INDEX); 
    } 

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

    LayoutInflater inflater = getActivity().getLayoutInflater(); 
    final View dialogView = inflater.inflate(R.layout.dialog_show_answer, null); 

    TextView questionText = (TextView) dialogView.findViewById(R.id.questionAnswerDialog); 
    TextView answerText = (TextView) dialogView.findViewById(R.id.answerAnswerDialog); 
    TextView dateText = (TextView) dialogView.findViewById(R.id.dateAnswerDialog); 
    final Button btnClose = (Button) dialogView.findViewById(R.id.btnClose); 
    final Button btnSave = (Button) dialogView.findViewById(R.id.btnSave); 
    ImageView editIcon = (ImageView) dialogView.findViewById(R.id.editIcon); 

    btnSave.setVisibility(View.GONE); 
    questionText.setText(mQuestion.getQuestion()); 
    answerText.setText(mQuestion.getAnswer()); 
    dateText.setText(mQuestion.getDateString()); 

    builder.setView(dialogView); 

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

      ViewSwitcher switcher = (ViewSwitcher) dialogView.findViewById(R.id.viewSwitcher); 
      final EditText editAnswer = (EditText) switcher.findViewById(R.id.editAnswerDialog); 

      if(btnSave.getVisibility() == View.GONE) { 
       btnSave.setVisibility(View.VISIBLE); 
      } else { 
       btnSave.setVisibility(View.GONE); 
      } 
      switcher.showNext(); //or switcher.showPrevious(); 
      editAnswer.setText(mQuestion.getAnswer()); 

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

        String answer = editAnswer.getText().toString(); 

        if (answer.length() > 0) { 

         mQuestion.setAnswerDate(); 
         mQuestion.setAnswer(answer); 

         QuestionBank questionBank = QuestionBank.get(getContext()); 

         questionBank.updateQuestion(mQuestion.getId(), mQuestion); 

         AnswersList callingActivity = (AnswersList) getActivity(); 
         callingActivity.getAdapter.updateList(); 

         Log.d(TAG, "notifyDataSetChanged() called"); 

         dismiss(); 
        } else { 
         Toast.makeText(getContext(), R.string.empty_answer_field, Toast.LENGTH_SHORT).show(); 
        } 


       } 
      }); 

     } 
    }); 

    btnClose.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      dismiss(); 
     } 
    }); 



    return builder.create(); 
} 

public void sendQuestionSelected(Question question) { 
    mQuestion = question; 
} 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 

    super.onSaveInstanceState(savedInstanceState); 
    if(mQuestion != null) 
     savedInstanceState.putParcelable(KEY_INDEX, mQuestion); 
} 


} 

我一直停留在這幾天。所有幫助讚賞!

+0

另一個相關問題:爲什麼我不能從第二個代碼塊調用第一個代碼塊中定義的updateList()。 updateList()是第一個塊中的嵌套BaseAdapter類的方法。當我嘗試在第二個塊中調用它時(callingActivity.getAdapter.updateList();)Android Studio說它無法解決它。 –

+0

我知道有一個簡單的解決方案來獲得ListView更新,我想通了。而不是: callingActivity.getAdapter.updateList(); 它應該是: ((AnswersList.AnswerAdapter)callingActivity.getAdapter())。updateList(); –

回答

0

I assume Question Bank是contentprovider/contentresolver。請參閱鏈接中的notifyChange方法?此方法觸發數據集更改事件。聽衆such as this會聽到該事件並重新加載數據/光標。也許不完全是你想要的,但也許這會幫助你走上正確的道路。

+0

QuestionBank是一個創建問題/答案/ ID行的sqlite數據庫的單例,並且還提取並更新這些行。內容提供者是否會扮演同樣的角色? –

+0

那正是內容提供者所做的。現在假設屏幕方向更改發生在查詢中。你是否想等待查詢完成,然後重新繪製屏幕再次查詢或使用內容提供者。我建議你看看一個代碼生成器工具,如https://github.com/BoD/android-contentprovider-generator這種實用工具或類似它的工具(谷歌內容提供者生成器)將爲你正確的代碼,你輸入表和列。 contentresolver用於執行實際查詢Cursorloader是您可以查看的另一件事。 – Pomagranite