2014-02-18 2 views
0

У меня есть ListView с элементами. Я использую XML для анализа данных. В этот момент я анализирую данные для одного элемента в DetailsView. Когда я нажал на элемент, как сделать DetailsView для элементов с SwipeViews между элементами? Как реализовать с помощью ViewPager? Я пытаюсь разработать несколько примеров, но не работал. Буду признателен, если кто-нибудь поможет мне.Swipe Details View

+0

Вы хотите красть между элементами ListView, когда вы нажали один из пунктов? – user666

+0

Когда я нажимаю элемент ListView, я перехожу к другому действию. В этом упражнении я хочу отображать детали с помощью SwipeViews, прокручивать между деталями. –

+0

О, подробности для элемента списка ListView. ОК, я опубликую код за несколько минут. – user666

ответ

2

Для этого сначала создайте Fragment. Это для одной детали. Деталь, которую вы проведете. Поэтому примените свой макет к этому.

@SuppressLint("ValidFragment") 
public class Detail extends Fragment { 


    private final String detail; 


     public DetailView(String detail) { 
      this.detail = detail; 
     } 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

     } 

     @Override 
     public void onActivityCreated(Bundle savedInstanceState) { 
      super.onActivityCreated(savedInstanceState); 

     } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.detailfragment, container, false); 

     TextView textView = (TextView) view.findViewById(R.id.detailText); 
     textView.setText(detail); 

     return view; 
    } 

} 

Теперь создайте свой Activity. Это Activity, что вы пойдете, когда вы щелкнете. Теперь код добавляет Fragment для каждой детали.

public class Main extends FragmentActivity { 

public static ViewPager mPager; 
private MyAdapter mAdapter; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    mPager = (ViewPager) findViewById(R.id.viewPager1); 

    mAdapter = new MyAdapter(getSupportFragmentManager()); 
    mPager.setAdapter(mAdapter); 
} 

public static class MyAdapter extends FragmentPagerAdapter { 
    public MyAdapter(FragmentManager fm) { 
     super(fm); 

    } 

    @Override 
    public int getCount() { 
    //The count of details. This will return 5 swipeable views. 
     return 5; 
    } 

    @Override 
    public Fragment getItem(int position) { 

      return new Detail("I'm a detail!"); 

       } 
} 


} 

Это создаст 5 деталей с текстом «Я деталь!». Теперь я предполагаю, что вы используете ArrayList, чтобы хранить детали. После этого вы можете получить детали как это:

public static class MyAdapter extends FragmentPagerAdapter { 
    public MyAdapter(FragmentManager fm, ArrayList<HashMap<String, String>> d) { 
     super(fm); 
     data = d; 
    } 

    @Override 
    public int getCount() { 
     return 5; 
    } 

    @Override 
    public Fragment getItem(int position) { 
    HashMap<String, String> map = new HashMap<String, String>(); 
    map = data.get(position); 
    Log.d("", data.get(position).toString()); 

      return new Detail(map.get('KeyForYourDetail')); 


       } 
} 

Также на вашем MainActivity изменения

mAdapter = new MyAdapter(getSupportFragmentManager()); 

к этому

mAdapter = new MyAdapter(getSupportFragmentManager(), yourArrayList); 

EDIT

Давайте начнем с самого начала. Во-первых, у вас есть MainActivity, который содержит ListView. В ListView вы вызываете предметы от ArrayList. Когда вы нажимаете на элемент, вы получаете информацию об этом от (?). Теперь мой код не может этого сделать. Вы должны сделать это самостоятельно. После того, как вы получите деталь, просто замените часть title ниже. Подводя итог, пост кода i должен работать, если вы можете получить «деталь», если вы не знаете, как получить детали, тогда вы должны создать другой вопрос.

return new Detail(title); 

EDIT 2

ОК, вот другая часть. Ниже приведен код для FragmentActivity.

Во-первых, мы должны объявить наш адаптер и ViewPager.

public static ViewPager mPager; 
private MyAdapter mAdapter; 
ArrayList<HashMap<String, String>> detailList= new ArrayList<HashMap<String, String>>(); 

MyAdapter это адаптер, который помещает детали в ViewPager. Чтобы сохранить данные, нам также нужен ArrayList, как я сказал выше. Теперь вы сказали, что у вас нет проблем с разбором. Поэтому я пропускаю эту часть. В то время как вы разбираете, я предполагаю, что вы используете NodeList (я взял эту часть из here)

NodeList nl = doc.getElementsByTagName(KEY_ITEM); 

// пробегаем по всем узлам элементов
для (INT I = 0; я < nl.getLength() ; i ++) { Строковое имя = parser.getValue (e, KEY_NAME); // имя дочернего значения Строка cost = parser.getValue (e, KEY_COST); // стоимость дочернего значения Описание строки = синтаксический анализатор.getValue (e, KEY_DESC); // значение Описания ребенка }

Внутри ваше для петли создайте HashMap как этого

HashMap<String, String> map = new HashMap<String, String>(); 

Помните, когда мы создавали НАШИ ArrayList? Объект был HashMap. Теперь мы собираемся заполнить наши данные для отображения, а затем добавить карту в ArrayList. (Опять же, это идет внутри для цикла)

map.put(TAG_DETAIL, detail); 
detailList.add(map); 

Теперь эта часть закончена, осталось только установка адаптера.

mAdapter = new MyAdapter(getSupportFragmentManager(), detailList); 
mPager.setAdapter(mAdapter); 

И все готово! Позвольте мне объяснить, что будет дальше. Вы помните наш адаптер?

public MyAdapter(FragmentManager fm, ArrayList<HashMap<String, String>> d) { 
     super(fm); 
     data = d; 
    } 

Здесь, как вы видите, это занимает FragmentManger и ArrayList с Hashmap внутри него. мы устанавливаем их с getSupportFragmentManager() и detailList. Адаптер принимает детальList с деталями внутри него, а затем создает с ним Fragments. Надеюсь, это было достаточно ясно. Если бы не было, спросите еще раз.

+0

Отлично! Я использую ArrayList. Спасибо. Если у меня возникнут проблемы, я напишу вам. –

+0

Если это работает, не забудьте [принять] (http://meta.stackexchange.com/a/5235/246892) – user666

+0

AnketSoruDetay, что это за класс? –

0

Это код MyAdapter.java:

общественного класса MyAdapter расширяет ArrayAdapter {

ImageLoader imageLoader; 
DisplayImageOptions options; 


public MyAdapter(Context ctx, int textViewResourceId, List<NewsFeed> sites) { 
    super(ctx, textViewResourceId, sites); 

    //Setup the ImageLoader, we'll use this to display our images 
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(ctx).build(); 
    imageLoader = ImageLoader.getInstance(); 
    imageLoader.init(config); 

    //Setup options for ImageLoader so it will handle caching for us. 
    options = new DisplayImageOptions.Builder() 
    .cacheInMemory() 
    .cacheOnDisc() 
    .build(); 
} 


/* 
* (non-Javadoc) 
* @see android.widget.ArrayAdapter#getView(int, android.view.View, android.view.ViewGroup) 
* 
* This method is responsible for creating row views out of a StackSite object that can be put 
* into our ListView 
*/ 
@Override 
public View getView(int pos, View convertView, ViewGroup parent){ 
    RelativeLayout row = (RelativeLayout)convertView; 
    Log.i("Feed", "getView pos = " + pos); 

// если (нуль == строка) { // // Нет переработанного вид, мы должны раздувать один. // LayoutInflater inflater = (LayoutInflater) parent.getContext(). GetSystemService (Context.LAYOUT_INFLATER_SERVICE); // row = (RelativeLayout) inflater.inflate (R.layout.list_item, null); //}

if (pos != 0){ 
     LayoutInflater inflater = (LayoutInflater)parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = (RelativeLayout)inflater.inflate(R.layout.list_item, null); 
    } 
    else 
    { 
     //No recycled View, we have to inflate one. 
     LayoutInflater inflater = (LayoutInflater)parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = (RelativeLayout)inflater.inflate(R.layout.list_first_item, null); 
    } 


    //Get our View References 
    final ImageView iconImg = (ImageView)row.findViewById(R.id.iconImg); 
    TextView titleTxt = (TextView)row.findViewById(R.id.titleTxt); 
    final ProgressBar indicator = (ProgressBar)row.findViewById(R.id.progress); 

    //Initially we want the progress indicator visible, and the image invisible 
    indicator.setVisibility(View.VISIBLE); 
    iconImg.setVisibility(View.INVISIBLE); 

    //Setup a listener we can use to swtich from the loading indicator to the Image once it's ready 
    ImageLoadingListener listener = new ImageLoadingListener(){ 



     @Override 
     public void onLoadingStarted(String arg0, View arg1) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onLoadingCancelled(String arg0, View arg1) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onLoadingComplete(String arg0, View arg1, Bitmap arg2) { 
      indicator.setVisibility(View.INVISIBLE); 
      iconImg.setVisibility(View.VISIBLE); 
     } 

     @Override 
     public void onLoadingFailed(String arg0, View arg1, FailReason arg2) { 
      // TODO Auto-generated method stub 

     } 

    }; 

    //Load the image and use our options so caching is handled. 
    imageLoader.displayImage(getItem(pos).getImgUrl(), iconImg,options, listener); 

    //Set the relavent text in our TextViews 
    titleTxt.setText(getItem(pos).getTitle()); 

    return row; 


} 

}

+0

Итак, это для вашего текущего ListView, не так ли? Если да, то как вы получаете детали? – user666

+0

Да, это для моего ListView. Я получаю такие детали: String title = mAdapter.getItem (pos) .getTitle(); \t \t \t \t \t Intent in = new Intent (FeedActivity.this, DetailsActivity.class); in.putExtra ("pos", pos); in.putExtra ("title", title); \t startActivity (in); –

+0

titleText = (TextView) findViewById (R.id.titleTxt); titleText.setText (getIntent(). GetExtras(). GetString ("title")); –