2014-09-22 2 views
2

Я попытался изменить вид изображения в android listview. Если у меня есть выбор строки из списка, есть 2 изображения. Они присутствуют, не посещают.change imageview в файле адаптера для Android android lisview

По умолчанию статус элемента присутствовал. если пользователь нажимает на изображение посетителя., функциональность выполняется, тогда необходимо изменить изображение посетителя, чтобы его не посещать.

Если пользователь нажимает изображение un-sttend, функция wll будет выполнена, тогда вам нужно будет изменить изображение без участия, чтобы посещать изображение.

У меня есть следующий код. Функциональность работает нормально. но изображение не изменилось во время выполнения. Проверьте код и дайте мне решение.

public class Today_List_Adapter extends BaseAdapter { 

private Activity activity; 
static ArrayList<HashMap<String, String>> data; 
private static LayoutInflater inflater=null; 
AlertDialog.Builder alertDialog; 
public ImageLoader imageLoader; 
String success,error; 
JSONParser jsonParser = new JSONParser(); 
public Today_List_Adapter(Activity a, ArrayList<HashMap<String, String>> d) { 
    activity = a; 
    data=d; 
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 
public int getCount() { 
    return data.size(); 

} 

public Object getItem(int position) { 
    return position; 
} 

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

public View getView(int position, View convertView, ViewGroup parent) { 
    View vi=convertView; 
    if(convertView==null) 
     vi = inflater.inflate(R.layout.listof_today, null); 

    TextView cartitle = (TextView)vi.findViewById(R.id.today_producttitle); 
    ImageView carimage = (ImageView)vi.findViewById(R.id.today_productimage); 
    TextView cardate = (TextView)vi.findViewById(R.id.today_productdate); 
    TextView cartime = (TextView)vi.findViewById(R.id.today_producttime); 
    TextView carddesc = (TextView)vi.findViewById(R.id.today_productdesc); 
    final ImageView cardetails = (ImageView)vi.findViewById(R.id.today_productimage_detail); 
    ImageView carcheckin = (ImageView)vi.findViewById(R.id.today_productimage_attend); 
    HashMap<String, String> Order = new HashMap<String, String>(); 
    Order = data.get(position); 
    cartitle.setText(Order.get(TodayList.TAG_CAR_TITLE)); 
    cardate.setText(Order.get(TodayList.TAG_CAR_SDATE)+" "+"-"+" "+Order.get(TodayList.TAG_CAR_EDATE)); 
    cartime.setText(Order.get(TodayList.TAG_CAR_TIME)); 
    carddesc.setText(Order.get(TodayList.TAG_CAR_DESC)); 
    imageLoader=new ImageLoader(activity.getApplicationContext()); 
    imageLoader.DisplayImage(Order.get(TodayList.TAG_CAR_IMAGE), carimage); 
    final String carid = Order.get(TodayList.TAG_CAR_ID); 
    final String shareurl = Order.get(TodayList.TAG_CAR_EURL); 
    final String plantoattend = Order.get(TodayList.TAG_CAR_STATUS); 
    if ((!(LoginForm.GoogleId.equalsIgnoreCase("No user found"))) 
      || (!(LoginForm.FacebookId.equalsIgnoreCase("No user found"))) 
      || (!(CommonUtils.login_status 
        .equalsIgnoreCase("No user found")))) { 
     if(plantoattend.equalsIgnoreCase("N")){ 
     cardetails.setImageResource(R.drawable.attend); 
    } 
    else { 
     cardetails.setImageResource(R.drawable.unattend); 
    } 
    } 
    else { 
     cardetails.setImageResource(R.drawable.attend); 
    } 
    cardetails.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 

        if(plantoattend.equalsIgnoreCase("N")){ 
    alertDialog = new AlertDialog.Builder(activity); 
       alertDialog.setMessage("You're going! Do you want to share the meet?"); 
    alertDialog.setPositiveButton("Share", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      Intent sendIntent = new Intent(); 
       sendIntent.setAction(Intent.ACTION_SEND); 
       sendIntent.putExtra(Intent.EXTRA_TEXT, shareurl); 
       sendIntent.setType("text/plain"); 
     cardetails.setImageResource(R.drawable.unattend); 
       activity.startActivityForResult(Intent.createChooser(sendIntent, "Share via"),1000); 
     } 
     }); 
    alertDialog.setNegativeButton("Not now", new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int which) { 
    dialog.dismiss(); 
    cardetails.setImageResource(R.drawable.unattend); 
    new AttendMeet().execute(carid); 

    } 
    }); 
    alertDialog.show(); 
      } 
       else{ 
        if (cd.isConnectingToInternet()) { 
        new UnAttendMeet().execute(carid); 
        cardetails.setImageResource(R.drawable.attend); 
        //Today_List_Adapter.this.notifyDataSetChanged(); 
        } 
        else { 
        alert.showAlertDialog(activity, "Internet Connection Error", 
          "Please Try Again Later", false); 
        return; 
       } 
       } 
     } 
      } 
     }); 
    carcheckin.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      Intent sendIntent = new Intent(); 
      sendIntent.setAction(Intent.ACTION_SEND); 
      sendIntent.putExtra(Intent.EXTRA_TEXT, shareurl); 
      sendIntent.setType("text/plain"); 
      activity.startActivity(sendIntent); 
     } 
    }); 
    return vi; 

    } 
    public void onActivityResult(int requestCode, int resultCode, Intent data,String... args) { 
    //super.onActivityResult(requestCode, resultCode, data); 

    switch(requestCode) { 
    case 1000: 
     Today_List_Adapter.this.notifyDataSetChanged(); 
     break; 

    } 

} 

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

    protected String doInBackground(String... args) { 
     try { 
      List<NameValuePair> params = new ArrayList<NameValuePair>(); 
      params.add(new BasicNameValuePair("user_id", CommonUtils.login_status)); 
      params.add(new BasicNameValuePair("event_id", args[0])); 
      JSONObject json = jsonParser.makeHttpRequest(url_attendmeet, 
        "POST", params); 
      Log.d("Attend Meet", json.toString()); 
      success = json.getString("status"); 
      if (success.equalsIgnoreCase("ok")) { 
       } 
      else 
      { 
       error = json.getString("error"); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    protected void onPostExecute(String file_url) { 
     if (success.equalsIgnoreCase("ok")) { 

      cardetails.setImageResource(R.drawable.unattend); 

       Toast.makeText(activity.getApplicationContext(), 
         "The meet was successfully added on attending meet", Toast.LENGTH_LONG).show(); 
      } 
      else 
      { 
       Toast.makeText(activity.getApplicationContext(), 
          error, Toast.LENGTH_LONG).show(); 
      } 

    } 

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

    protected String doInBackground(String... args) { 
     try { 
      List<NameValuePair> params = new ArrayList<NameValuePair>(); 
      params.add(new BasicNameValuePair("user_id", CommonUtils.login_status)); 
      params.add(new BasicNameValuePair("event_id", args[0])); 
      JSONObject json = jsonParser.makeHttpRequest(url_unattendmeet, 
        "POST", params); 
      Log.d("UnAttend Meet", json.toString()); 
      success = json.getString("status"); 
      if (success.equalsIgnoreCase("ok")) { 

      } 
      else 
      { 
       error = json.getString("error"); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    protected void onPostExecute(String file_url) { 
     if (success.equalsIgnoreCase("ok")) { 
      cardetails.setImageResource(R.drawable.attend); 

       Toast.makeText(activity, 
         "The meet was successfully removed from attending meet", Toast.LENGTH_LONG).show(); 
      } 
      else 
      { 

       Toast.makeText(activity, 
          error, Toast.LENGTH_LONG).show(); 
      } 

      } 
      } 

     } 

EDIT:

Я обновил свой код.

Теперь я запустить приложение, я получаю результаты, как:.

Если пользователь нажимает на ПРИСУТСТВУЙТЕ изображение, функциональность будет сделано хорошо, то изображение было изменено с озаботиться не-посещают image.But. снова я нажимаю на изображение без участия., вам нужно сделать вызов класса UnAttned. Но он вызывает только класс Attend. Не могли бы вы проверить мой код и дать мне решения.

+0

Вы отлаживали, что код 'cardetails.setImageResource' выполняется или нет, пока вы нажимаете изображение? –

+0

@MysticMagic Am get the toast message « « Встреча была успешно добавлена ​​на посещение встречи ». Но изображение еще не изменилось. –

+0

Попробуйте вызвать' yourAdapter.notifyDataSetChanged(); 'после вызова' setImageResource'. –

ответ

1

Исходные данные также должны быть изменены, в случае, если представления по какой-либо причине заселялись (например, вызывал notifyDataSetChanged(), прокручивался вне поля зрения и т. Д.). Измените это исправить непосредственную проблему (Order должен быть окончательным):

... 
cardetails.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 

     if (plantoattend.equalsIgnoreCase("N")) { 
      alertDialog = new AlertDialog.Builder(activity); 
      alertDialog.setMessage("You're going! Do you want to share the meet?"); 
      alertDialog.setPositiveButton("Share", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        Intent sendIntent = new Intent(); 
        sendIntent.setAction(Intent.ACTION_SEND); 
        sendIntent.putExtra(Intent.EXTRA_TEXT, shareurl); 
        sendIntent.setType("text/plain"); 
        cardetails.setImageResource(R.drawable.unattend); 
        activity.startActivityForResult(Intent.createChooser(sendIntent, "Share via"), 1000); 
       } 
      }); 
      alertDialog.setNegativeButton("Not now", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
        Order.put(TodayList.TAG_CAR_STATUS, "Y"); // CHANGE THE UNDERLYING DATA HERE 
        cardetails.setImageResource(R.drawable.unattend); 
        new AttendMeet().execute(carid); 

       } 
      }); 
      alertDialog.show(); 
     } else { 
      if (cd.isConnectingToInternet()) { 
       new UnAttendMeet().execute(carid); 
       Order.put(TodayList.TAG_CAR_STATUS, "N"); // CHANGE THE UNDERLYING DATA HERE 
       cardetails.setImageResource(R.drawable.attend); 
       //Today_List_Adapter.this.notifyDataSetChanged(); 
      } else { 
       alert.showAlertDialog(activity, "Internet Connection Error", 
           "Please Try Again Later", false); 
       return; 
      } 
     } 
    } 
}); 
... 

Однако я не хотел бы оставить этот ответ, зная, что есть намного больше проблем, которые вы собираетесь работать в:

  1. Вы не должны напрямую манипулировать ImageView, как в onPostExecute. К моменту завершения работы AsyncTask представление может быть переработано и заполнено другими данными. Скорее, измените базовые данные и при необходимости вызовите notifiedDataSetChanged.
  2. AsyncTask, не сохраняя ссылки на (многократные!) Средства AsyncTasks, вы не сможете отменить их, когда пользователь рано или поздно покидает действие/фрагмент. Это означает, что все, что касается пользовательского интерфейса, приведет к сбою приложения. Хотя абсолютно возможно выполнять запросы REST с использованием AsyncTasks, это болезненно и очень быстро усложняется, если вы выполняете больше, чем несколько запросов. Посмотрите на библиотеки, такие как Retrofit или Volley.
  3. Поиск взглядов с помощью findViewById медленный и приведет к задержке прокрутки, попробуйте шаблон ViewHolder.
  4. Сохранение данных на карте, как будто вы делали «несколько», но очень не-Java-иш, и вам придется посыпать свой код нулевыми проверками или рисковать исключениями с нулевым указателем. Используйте POJO вместо
  5. Соблюдайте соглашения об именах и упростите для себя и всех остальных возможность читать ваш код.

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

+0

Мы не можем назначить значение для конечной переменной справа –

+0

В вашем случае вы не можете r eassign другой HashMap для заказа, но вы все равно можете внести изменения в значения ключа внутри HashMap. –

+0

Я вижу вашу проблему. '' HashMap Order = new HashMap (); '' '' Order = data.get (position); '' не имеет смысла, просто используйте '' final HashMap < String, String> Order = data.get (position) '' –

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