2017-01-16 2 views
0

Этот код предназначен для ListView, который дает Вопрос и их ответы в каждом элементе списка. Я добавил кнопку ПОКАЗАТЬ ОТВЕТ. Когда я нажимаю на SHOW ANSWER первого элемента, он показывает ответ первого элемента, 4-й элемент, 7-й элемент, 10-й элемент & и так далее.Кнопка на первом элементе ListView позволяет отвечать на 4, 7, 10-й элементы listView также

Мой Aptitude.java

public class Aptitude extends AppCompatActivity { 

    private String TAG = Aptitude.class.getSimpleName(); 
    private ProgressDialog pDialog; 
    private ListView lv; 
    boolean first = true; 

    // URL to get questions 
    private int offset = 0; 
    private int limit = 10; 
    private int faq = 2; 

    private String url = "xyz/gk_app/qa.php/?faq="+ faq + "&offset=" + offset + "&limit=" + limit; 

    String ques, optn_a, optn_b, optn_c, optn_d, correct_optn; 

    View loading_footer; 
    private int preLast; 
    Boolean flag = false; 

    Aptitude_Custom_Adapter adapter; 

    private ArrayList<String> array_questions = new ArrayList<String>(); 
    private ArrayList<String> array_correct_answer = new ArrayList<String>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_aptitude); 

     lv = (ListView) findViewById(R.id.listView_aptitude); 

     loading_footer = lv.inflate(Aptitude.this, R.layout.loading_footer, null); 
     lv.removeFooterView(loading_footer); 

     new GetQuestions().execute(); 

     lv.setOnScrollListener(new AbsListView.OnScrollListener() { 
      @Override 
      public void onScrollStateChanged(AbsListView absListView, int i) { 
      } 

      @Override 
      public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 

       final int lastItem = firstVisibleItem + visibleItemCount; 

       if(lastItem == totalItemCount) { 
        if(preLast!=lastItem && flag == true) { 
         lv.addFooterView(loading_footer); 
         flag = false; 
         new GetQuestions().execute(); 
         preLast=lastItem; 
        } 
       } 
      } 
     }); 
     android.support.v7.app.ActionBar actionBar = getSupportActionBar(); 
     actionBar.setDisplayHomeAsUpEnabled(true); 
    } 

    private class GetQuestions extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      // Showing progress dialog 
      pDialog = new ProgressDialog(Aptitude.this); 
      pDialog.setTitle("Loading question"); 
      pDialog.setMessage("Please wait..."); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
     } 

     @Override 
     protected Void doInBackground(Void... voids) { 

      HttpHandler sh = new HttpHandler(); 
      String jsonStr = sh.makeServiceCall(url); 

      Log.e(TAG, "Response from url: " + jsonStr); 

      if (jsonStr != null) { 
       try { 
        JSONObject jsonObj = new JSONObject(jsonStr); 
        JSONArray questions = jsonObj.getJSONArray("questions"); 
        url = jsonObj.getString("next_url"); 

        // looping 
        for (int i = 0; i < questions.length(); i++) { 
         JSONObject c = questions.getJSONObject(i); 

         ques = c.getString("questions"); 
         optn_a = c.getString("optn_a"); 
         optn_b = c.getString("optn_b"); 
         optn_c = c.getString("optn_c"); 
         optn_d = c.getString("optn_d"); 
         correct_optn = c.getString("correct_answer"); 

         array_questions.add(ques); 
         array_correct_answer.add(chooseCorrectAnswer(optn_a, optn_b, optn_c, optn_d, correct_optn)); 
        } 

       } catch (final JSONException e) { 
        Log.e(TAG, "Json parsing error: " + e.getMessage()); 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          Toast.makeText(getApplicationContext(), 
            "Json parsing error: " + e.getMessage(), 
            Toast.LENGTH_LONG) 
            .show(); 
         } 
        }); 
       } 
      } else { 
       Log.e(TAG, "Couldn't get json from server."); 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         Toast.makeText(getApplicationContext(), 
           "Couldn't get json from server. Check LogCat for possible errors!", 
           Toast.LENGTH_LONG) 
           .show(); 
        } 
       }); 
      } 
      return null; 
     } 

     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 

      if (pDialog.isShowing()) 
       pDialog.dismiss(); 

      if(first == true) { 
       adapter = new Aptitude_Custom_Adapter(array_questions, array_correct_answer, getApplicationContext()); 
       lv.setAdapter(adapter); 
       first = false; 
      } else { 
       int currentPosition = lv.getFirstVisiblePosition(); 

       adapter.add(array_questions, array_correct_answer); 
       adapter.notifyDataSetChanged(); 

      //  Appending new data to menuItems ArrayList 
      //  adapter = new Aptitude_Custom_Adapter(array_questions, array_correct_answer, getApplicationContext()); 
      //  lv.setAdapter(adapter); 
      //  Setting new scroll position 
       lv.setSelectionFromTop(currentPosition + 1, 0); 

      } 
      lv.removeFooterView(loading_footer); 
      flag = true; 
     } 
    } 

    private String chooseCorrectAnswer(final String optn_a, final String optn_b, final String optn_c, final String optn_d, final String correct_optn) { 
     String correct_answer = null; 
     if(correct_optn.equals("optn_a")){ 
      correct_answer = optn_a; 
     } if(correct_optn.equals("optn_b")){ 
      correct_answer = optn_b; 
     } if(correct_optn.equals("optn_c")){ 
      correct_answer = optn_c; 
     } if(correct_optn.equals("optn_d")){ 
      correct_answer = optn_d; 
     } 
     return correct_answer; 
    } 

    @Override 
    public void onBackPressed() { 
     Intent intent = new Intent(Aptitude.this, MainActivity.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); 
     array_questions.removeAll(array_questions); 
     array_correct_answer.removeAll(array_correct_answer); 
     startActivity(intent); 
     finish(); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case android.R.id.home: 
       // app icon in action bar clicked; goto parent activity. 
       this.finish(); 
       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 
} 

И адаптер Aptitude_Custom_Adapter.java

public class Aptitude_Custom_Adapter extends BaseAdapter{ 

    private Context activity; 
    private static LayoutInflater inflater=null; 
    public Resources res;; 
    private ArrayList<String> questionlist, correct_ans; 

    public Aptitude_Custom_Adapter(ArrayList<String> q, ArrayList<String> c, Context a) { 
     activity = a; 
     questionlist=q; 
     correct_ans=c; 
     System.out.println("in const: " + questionlist.size()); 
    } 

    public void add(ArrayList<String> q, ArrayList<String> c){ 
     questionlist.addAll(q); 
     correct_ans.addAll(c); 
     System.out.println("in add: " + questionlist.size()); 
    } 

    @Override 
    public void notifyDataSetChanged() { 
     super.notifyDataSetChanged(); 
    } 

    @Override 
    public int getCount() { 
     if(questionlist.size()<=0) 
      return 1; 
     return questionlist.size(); 
    } 

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

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

    public static class ViewHolder{ 

     public TextView ques_no, text_ques, text_ans; 
     public Button btn_ansr_show_hide; 
     public Boolean flag = true; 
    } 

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

     View vi = convertView; 
     final ViewHolder holder; 

     if(convertView==null){ 
      inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      vi = inflater.inflate(R.layout.aptitude_list_item, null); 

      holder = new ViewHolder(); 
      holder.ques_no = (TextView) vi.findViewById(R.id.tv_ttp_ques_no); 
      holder.text_ques = (TextView) vi.findViewById(R.id.tv_ttp_question); 
      holder.text_ans = (TextView) vi.findViewById(R.id.tv_ttp_answer); 
      holder.btn_ansr_show_hide = (Button) vi.findViewById(R.id.btn_ansr_show_hide); 

      vi.setTag(holder); 

     } else 
      holder=(ViewHolder)vi.getTag(); 

     if(questionlist.size()<=0){ 
      holder.text_ques.setText("No Data"); 
      holder.text_ans.setText("No Data"); 
      holder.btn_ansr_show_hide.setText(""); 
     } else { 
      holder.ques_no.setText("Question No. " + String.valueOf(position+1)); 
      holder.text_ques.setText(questionlist.get(position).concat("?")); 

      holder.btn_ansr_show_hide.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
         System.out.println("Position: "+position); 
         holder.btn_ansr_show_hide.setVisibility(View.GONE); 
         if (correct_ans.get(position).length() > 30){ 
          holder.text_ans.setText(correct_ans.get(position).concat(".")); 
         } else { 
          holder.text_ans.setText(correct_ans.get(position)); 
         } 
         holder.flag = false; 
        } 
      }); 

      if (holder.flag == false){ 
       if (correct_ans.get(position).length() > 30){ 
        holder.text_ans.setText(correct_ans.get(position).concat(".")); 
       } else { 
        holder.text_ans.setText(correct_ans.get(position)); 
       } 
      } 
     } 
     return vi; 
    } 
} 

Основной макет activity_aptitude.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="@dimen/activity_margin" 
    android:background="@color/background" 
    tools:context=".Aptitude"> 

    <android.support.v7.widget.CardView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     card_view:cardCornerRadius="2dp" 
     android:padding="8dp" 
     android:layout_marginBottom="10dp"> 

     <LinearLayout 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:padding="5dp" 
      android:gravity="center_vertical|center_horizontal"> 

      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textAppearance="?android:attr/textAppearanceLarge" 
       android:text="Aptitude Questions" 
       android:id="@+id/to_aptitude" 
       android:textStyle="bold" 
       android:textColor="#ff6b6b" 
       android:layout_gravity="center" 
       android:gravity="center_vertical|center_horizontal" /> 
     </LinearLayout> 

    </android.support.v7.widget.CardView> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"> 

     <ListView 
      android:id="@+id/listView_aptitude" 
      android:layout_width="fill_parent" 
      android:layout_height="match_parent" /> 
    </LinearLayout> 

</LinearLayout> 

И элемент списка макет aptitude_list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/background"> 

    <android.support.v7.widget.CardView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     card_view:cardCornerRadius="2dp" 
     android:padding="8dp" 
     android:layout_marginBottom="10dp"> 

     <LinearLayout 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:padding="6dp" 
      android:gravity="center_vertical|center_horizontal" 
      android:background="#ffffff"> 


      <LinearLayout 
       android:orientation="vertical" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:id="@+id/layout_question"> 

       <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:textAppearance="?android:attr/textAppearanceLarge" 
        android:text="Question: " 
        android:id="@+id/tv_ttp_ques_no" 
        android:textColor="#4a46c1" /> 

       <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:textAppearance="?android:attr/textAppearanceLarge" 
        android:text="This is a Sample question. This is a Sample question. This is a Sample question. This is a Sample question. " 
        android:id="@+id/tv_ttp_question" 
        android:textSize="20dp" 
        android:textColor="#272727" /> 
      </LinearLayout> 

      <LinearLayout 
       android:orientation="vertical" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:layout_marginTop="10dp" 
       android:id="@+id/layout_answer"> 

       <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:textAppearance="?android:attr/textAppearanceLarge" 
        android:text="Answer: " 
        android:id="@+id/tv_answer" 
        android:textColor="#4a46c1" /> 

       <LinearLayout 
        android:orientation="horizontal" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent"> 

        <TextView 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:textAppearance="?android:attr/textAppearanceLarge" 
         android:text="" 
         android:id="@+id/tv_ttp_answer" 
         android:textSize="20dp" 
         android:textColor="#272727" /> 

        <Button 
         style="?android:attr/buttonStyleSmall" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:text="Show Answer" 
         android:id="@+id/btn_ansr_show_hide" 
         android:background="@color/transparent" 
         android:textColor="@color/colorPrimary" 
         android:gravity="center_vertical|center_horizontal" /> 

       </LinearLayout> 

      </LinearLayout> 
     </LinearLayout> 

    </android.support.v7.widget.CardView> 

</LinearLayout> 
+0

В чем проблема? – ecc

ответ

0

Создайте класс с именем Question вот так.

public class Question { 
    public String question; 
    public boolean answerShowed = false; // Make the attribute false by default 

    // Add a constructor 
    public void Question(String question, boolean answerShowed) { 
     this.question = question; 
     this. answerShowed = answerShowed; 
    } 
} 

Теперь возьмите ArrayList как

private ArrayList<String> array_questions = new ArrayList<Question>(); 

И Добавляя вопросы в ArrayList

ques = c.getString("questions"); 
Question q = new Question(ques, false); 
array_questions.add(q); // Add the object 

Теперь вам нужно изменить ваш адаптер немного. Сначала конструктор вашего адаптера должен взять ArrayList объекта Question.

private ArrayList<Question> questionlist; 

public Aptitude_Custom_Adapter(ArrayList<Question> q, ArrayList<String> c, Context a) { 
    activity = a; 
    questionlist = q; 
    correct_ans = c; 
    System.out.println("in const: " + questionlist.size()); 
} 

Теперь вы должны изменить ваши getView и другие функции соответственно. Возьмите строку вопроса с questionlist.get(position).question.

Сложная часть, которую вы пропустили в своем адаптере, - это установить видимость за пределами вашей функции holder.btn_ansr_show_hide.setOnClickListener. И, кроме всего прочего, вам необходимо предоставить как if-else условие для показа или исчезновения кнопки SHOW ANSWER.

Значит, ваша функция getView должна выглядеть примерно так.

+0

Он возвращает несколько данных, 10, 36, 72 и т. Д. У меня есть только 18 вопросов. –

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