#android #adapter #swipe-gesture
#Android #адаптер #проведите пальцем-жест
Вопрос:
Я работаю над проектом, который сохраняет некоторые изображения на sdcard, и теперь мне нужно создать viewflow, чтобы показать эти изображения. Я получаю изображения по его идентификатору с SD-карты, и теперь моя проблема заключается в том, как переключаться между разными изображениями. Вот код, который я использую :
import java.io.File;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
public class Cards extends Activity {
public Cursor cursor;
int position;
int indexxx;
Bitmap b;
int objectId;
int cardsId;
private ViewFlow viewFlow;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.circle_layout);
UserDatabaseHelper userDbHelper = new UserDatabaseHelper(this, null, 1);
userDbHelper.initialize(this);
final int cardId = getIntent().getIntExtra("card_id",0);
Log.i("Card Id ","Card Id : " cardId);
final int collId = getIntent().getIntExtra("collection_id",0);
Log.i("Collection Id ","Collection Id : " collId);
position = getIntent().getIntExtra("position",0);
Log.i("position","position : " position);
String cardSQL = "SELECT cm.objectId "
"FROM cardmedias AS cm "
"INNER JOIN cards AS cd "
"ON (cm.cardId = cd.objectId) "
"WHERE cd.collectionId=" collId;
Cursor cards = userDbHelper.executeSQLQuery(cardSQL);
if (cards.getCount() == 0) {
Log.i("", "No Image file");
cards.close();
} else if (cards.getCount() > 0) {
for (cards.move(0); cards.moveToNext(); cards.isAfterLast()) {
cardsId = Integer.parseInt(cards.getString(cards
.getColumnIndex("objectId")));
Log.i("", "cards objectId : " cardsId);
String path = Environment.getExternalStorageDirectory()
"/.Stampii/MediaCard/" cardsId ".png";
Log.i("", "path : " path);
}
}
String sql = "SELECT objectId FROM cardmedias WHERE cardId=" cardId
" LIMIT 1";
Cursor cursor = userDbHelper.executeSQLQuery(sql);
if (cursor.getCount() == 0) {
Log.i("", "No Image file");
cursor.close();
} else if (cursor.getCount() > 0) {
for (cursor.move(0); cursor.moveToNext(); cursor.isAfterLast()) {
objectId = Integer.parseInt(cursor.getString(cursor
.getColumnIndex("objectId")));
Log.i("", "objectId : " objectId);
}
}
Button info = (Button) findViewById(R.id.info_button);
info.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Cards.this, SingleCardInfo.class);
intent.putExtra("card_id", cardId);
intent.putExtra("collection_id", collId);
startActivity(intent);
}
});
Button back = (Button) findViewById(R.id.back_button);
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
final ArrayList<Bitmap> images = new ArrayList<Bitmap>();
String path = Environment.getExternalStorageDirectory() "/.Stampii/MediaCard/" objectId ".png";
BitmapFactory.Options options = new BitmapFactory.Options();
options.inTempStorage = new byte[16*1024];
Bitmap b = BitmapFactory.decodeFile(path, options);
images.add(b);
viewFlow = (ViewFlow) findViewById(R.id.viewflow);
viewFlow.setAdapter(new ImageAdapter(this, images),position);
ImageButton prevBtn = (ImageButton) findViewById(R.id.previous_button);
prevBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
indexxx = viewFlow.getSelectedItemPosition()-1;
if (indexxx>=0) {
viewFlow.setAdapter(new ImageAdapter(Cards.this, images),indexxx);
viewFlow.setSelectedItemPosition(indexxx);
Log.i("indexxx", "indexxx : " indexxx);
}
}
});
ImageButton nextBtn = (ImageButton) findViewById(R.id.next_button);
nextBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
indexxx = viewFlow.getSelectedItemPosition() 1;
if (indexxx<=images.size()) {
viewFlow.setAdapter(new ImageAdapter(Cards.this, images),indexxx);
viewFlow.setSelectedItemPosition(indexxx);
Log.i("indexxx", "indexxx : " indexxx);
}
}
});
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
viewFlow.onConfigurationChanged(newConfig);
}
}
И вот мой класс ImageAdapter :
import java.util.ArrayList;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
public class ImageAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private ArrayList<Bitmap> ids = new ArrayList<Bitmap>();
private Bitmap bitmap;
public ImageAdapter(Context context, ArrayList<Bitmap> images) {
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ids = images;
}
@Override
public int getCount() {
return 1;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.image_item, null);
}
((ImageView) convertView.findViewById(R.id.imgView)).setImageBitmap(ids.get(position));
return convertView;
}
}
Любая идея, как я могу установить следующее или предыдущее изображение, получив его идентификатор из базы данных, найдя изображение с этим именем и добавив его в viewflow и swipe. Я не хочу, чтобы кто-то писал код вместо меня… Я застрял на идее, как я могу это сделать… Так что, если кто-то может помочь мне с предложениями, идеями или чем-то еще, просто снимайте это.
Заранее спасибо!
Ответ №1:
Я думаю, вы довольно близки к тому, чтобы заставить его работать.
getCount()
должно быть так:
@Override
public int getCount() {
return ids.size();
}
ОТРЕДАКТИРОВАНО:
Вы должны создать только один экземпляр ImageAdapter
, вы создаете новые экземпляры внутри onClick
. Также вы должны использовать setSelection()
вместо setSelectedItemPosition()
. Кажется, последнее предназначено для внутреннего:
@Override
public void onClick(View v) {
indexxx = viewFlow.getSelectedItemPosition()-1;
if (indexxx>=0) {
viewFlow.setSelection(indexxx);
Log.i("indexxx", "indexxx : " indexxx);
}
}
/* ... */
@Override
public void onClick(View v) {
indexxx = viewFlow.getSelectedItemPosition() 1;
if (indexxx<images.size()) { // Should be <, you have a wrong boundary check here!!!
viewFlow.setSelection(indexxx);
Log.i("indexxx", "indexxx : " indexxx);
}
}
Комментарии:
1. на самом деле это должно сработать, но есть ли у вас какие-либо идеи, как я могу добавить только 3 растровых изображения на каждый свайп. Текущий, предыдущий и следующий. Потому что, если я попытаюсь загрузить все растровые изображения, я получаю исключение из памяти. Спасибо!
2. Я думаю, вам следует использовать эскизы вместо оригинальных изображений.
3. Я думаю, что на самом деле это слишком сложно, но именно так мой босс хочет, чтобы этот список работал.
4. Вы настраиваете количество загружаемых просмотров (или растровых изображений в вашем случае), устанавливая боковой буфер потока просмотра. Каково ваше текущее значение бокового буфера? Обычно это задается в вашем макете xml. По умолчанию равно 2, что означает 2 * 2 1 = 5 загруженных растровых изображений. Если ваши растровые изображения действительно большие, вам может не хватить памяти.
Ответ №2:
Вот как я решаю эту проблему :
import java.util.ArrayList;
import java.util.HashMap;
import com.stampii.stampii.R;
import com.stampii.stampii.comm.rpc.UserDatabaseHelper;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
public class Cards extends Activity {
public Cursor cursor;
int indexxx;
Bitmap b;
int objectId;
int cardsId;
ArrayList<Integer> ids;
String path;
int mediaType = 5001;
ArrayList<String> images;
int card;
String cardSQL;
private ViewFlow viewFlow;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.circle_layout);
UserDatabaseHelper userDbHelper = new UserDatabaseHelper(this, null, 1);
userDbHelper.initialize(this);
HashMap<Integer, String> hm = new HashMap<Integer, String>();
ids = new ArrayList<Integer>();
images = new ArrayList<String>();
/*
* Card ID - Getting the right card
*/
final int cardId = getIntent().getIntExtra("card_id", 0);
Log.i("Card Id ", "Card Id CARDS : " cardId);
/*
* Collection ID - Getting the right Collection Cards
*/
final int collId = getIntent().getIntExtra("collection_id", 0);
Log.i("Collection Id ", "Collection Id : " collId);
// Position of Clicked Item
int position = getIntent().getIntExtra("position", 0);
Log.i("position", "position : " position);
/*
* Indicating which activity is opening this one for selecting the right
* cards from Database. Value 1 : All Stampii - listing all owned
* stampii cards Value 2 : Owned Stampii - listing all owned stampii
* cards Value 3 : Repeated Stampii - listing only repeated stampii
* cards Value 4 : Last Acquired - listing the last acquired stampii
* cards
*/
int activity = getIntent().getIntExtra("activity", 1);
Log.d("", "activity : " activity);
/*
* Indicating the Sort Type : Value 1 : Sort by Tags Value 2 : Sort by
* Categories Value 3 : Sort by Date
* By Default the sort type is by Tags! (Bad-Ass Muthaphucka)
*/
int sort = getIntent().getIntExtra("sort_type", 1);
Log.d("", "sort type : " sort);
int extra = getIntent().getIntExtra("extra", 0);
Log.d("", "extra : " extra);
switch (activity) {
case 1: // All Stampii
cardSQL = getOwnedCards(sort, collId, extra);
break;
case 2: // Owned Stampii
cardSQL = getOwnedCards(sort, collId, extra);
break;
case 3: // Repeated Stampii
cardSQL = getRepeatedCards(sort, collId, extra);
break;
case 4: // Last Acquired
cardSQL = getOwnedCards(sort, collId, extra);
break;
}
Cursor cards = userDbHelper.executeSQLQuery(cardSQL);
if (cards.getCount() == 0) {
cards.close();
} else if (cards.getCount() > 0) {
for (cards.move(0); cards.moveToNext(); cards.isAfterLast()) {
cardsId = Integer.parseInt(cards.getString(cards
.getColumnIndex("objectId")));
card = Integer.parseInt(cards.getString(cards
.getColumnIndex("cardId")));
String path = Environment.getExternalStorageDirectory()
"/.Stampii/MediaCard/" cardsId ".png";
ids.add(card);
hm.put(cardsId, path);
path = hm.get(cardsId);
images.add(path);
}
}
Button back = (Button) findViewById(R.id.back_button);
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
viewFlow = (ViewFlow) findViewById(R.id.viewflow);
viewFlow.setAdapter(new ImageAdapter(this, images), position);
ImageButton prevBtn = (ImageButton) findViewById(R.id.previous_button);
prevBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
indexxx = viewFlow.getSelectedItemPosition() - 1;
if (indexxx >= 0) {
viewFlow.setAdapter(new ImageAdapter(Cards.this, images),
indexxx);
viewFlow.setSelectedItemPosition(indexxx);
Log.i("indexxx", "indexxx : " indexxx);
}
}
});
ImageButton nextBtn = (ImageButton) findViewById(R.id.next_button);
nextBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
indexxx = viewFlow.getSelectedItemPosition() 1;
if (indexxx < images.size()) {
viewFlow.setAdapter(new ImageAdapter(Cards.this, images),
indexxx);
viewFlow.setSelectedItemPosition(indexxx);
Log.i("indexxx", "indexxx : " indexxx);
}
}
});
Button info = (Button) findViewById(R.id.info_button);
info.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Cards.this, SingleCardInfo.class);
intent.putExtra("card_id",
ids.get(viewFlow.getSelectedItemPosition()));
intent.putExtra("collection_id", collId);
startActivity(intent);
}
});
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
viewFlow.onConfigurationChanged(newConfig);
}
public String getOwnedCards(int sort, int collId, int extra) {
String sql = "";
switch (sort) {
case 1: // Sort by Tags
if (extra != 0)
sql = "SELECT DISTINCT cm.cardId, cm.objectId "
"FROM cardmedias AS cm " "INNER JOIN cards AS cd "
"ON (cm.cardId = cd.objectId) "
"INNER JOIN cardtags AS ct "
"ON (cd.objectId = ct.cardId) "
"INNER JOIn tags AS tg "
"ON (tg.objectId = ct.tagId) "
"WHERE cd.collectionId=" collId
" AND cm.mediaType=" mediaType
" AND tg.objectId=" extra;
else if (extra == 0)
sql = "SELECT DISTINCT cm.cardId, cm.objectId "
"FROM cardmedias AS cm " "INNER JOIN cards AS cd "
"ON (cm.cardId = cd.objectId) "
"INNER JOIN cardtags AS ct "
"ON (cd.objectId = ct.cardId) "
"INNER JOIn tags AS tg "
"ON (tg.objectId = ct.tagId) "
"WHERE cd.collectionId=" collId
" AND cm.mediaType=" mediaType;
break;
case 2: // Sort by Categories
if (extra != 0)
sql = "SELECT DISTINCT cm.cardId, cm.objectId "
"FROM cardmedias AS cm " "INNER JOIN cards AS cd "
"ON (cm.cardId = cd.objectId) "
"INNER JOIN categories AS cats "
"ON (cd.categoryId = cats.objectId) "
"WHERE cd.collectionId=" collId
" AND cm.mediaType=" mediaType
" AND cats.objectId=" extra;
else if (extra == 0)
sql = "SELECT DISTINCT cm.cardId, cm.objectId "
"FROM cardmedias AS cm " "INNER JOIN cards AS cd "
"ON (cm.cardId = cd.objectId) "
"INNER JOIN categories AS cats "
"ON (cd.categoryId = cats.objectId) "
"WHERE cd.collectionId=" collId
" AND cm.mediaType=" mediaType;
break;
case 3: // Sort by Date
String ASCDESC = getIntent().getStringExtra("ascdesc");
if (extra != 0)
sql = "SELECT DISTINCT cm.cardId, cm.objectId "
"FROM cardmedias AS cm " "INNER JOIN cards AS cd "
"ON (cm.cardId = cd.objectId) "
"INNER JOIN categories AS cats "
"ON (cd.categoryId = cats.objectId) "
"WHERE cd.collectionId=" collId
" AND cm.mediaType=" mediaType
" ORDER BY cd.dateCreated " ASCDESC;
else if (extra == 0)
sql = "SELECT DISTINCT cm.cardId, cm.objectId "
"FROM cardmedias AS cm " "INNER JOIN cards AS cd "
"ON (cm.cardId = cd.objectId) "
"INNER JOIN categories AS cats "
"ON (cd.categoryId = cats.objectId) "
"WHERE cd.collectionId=" collId
" AND cm.mediaType=" mediaType;
break;
}
return sql;
}
public String getRepeatedCards(int sort, int collId, int extra){
String sql="";
switch (sort) {
case 1: // Sort by Tags
if (extra != 0)
sql = "SELECT DISTINCT cm.cardId, cm.objectId "
"FROM cardmedias AS cm " "INNER JOIN cards AS cd "
"ON (cm.cardId = cd.objectId) "
"INNER JOIN cardtags AS ct "
"ON (cd.objectId = ct.cardId) "
"INNER JOIn tags AS tg "
"ON (tg.objectId = ct.tagId) "
"WHERE cd.collectionId=" collId
" AND cd.repeatsCount>1"
" AND cm.mediaType=" mediaType
" AND tg.objectId=" extra;
else if (extra == 0)
sql = "SELECT DISTINCT cm.cardId, cm.objectId "
"FROM cardmedias AS cm " "INNER JOIN cards AS cd "
"ON (cm.cardId = cd.objectId) "
"INNER JOIN cardtags AS ct "
"ON (cd.objectId = ct.cardId) "
"INNER JOIn tags AS tg "
"ON (tg.objectId = ct.tagId) "
"WHERE cd.collectionId=" collId
" AND cd.repeatsCount>1"
" AND cm.mediaType=" mediaType;
break;
case 2: // Sort by Categories
if (extra != 0)
sql = "SELECT DISTINCT cm.cardId, cm.objectId "
"FROM cardmedias AS cm " "INNER JOIN cards AS cd "
"ON (cm.cardId = cd.objectId) "
"INNER JOIN categories AS cats "
"ON (cd.categoryId = cats.objectId) "
"WHERE cd.collectionId=" collId
" AND cd.repeatsCount>1"
" AND cm.mediaType=" mediaType
" AND cats.objectId=" extra;
else if (extra == 0)
sql = "SELECT DISTINCT cm.cardId, cm.objectId "
"FROM cardmedias AS cm " "INNER JOIN cards AS cd "
"ON (cm.cardId = cd.objectId) "
"INNER JOIN categories AS cats "
"ON (cd.categoryId = cats.objectId) "
"WHERE cd.collectionId=" collId
" AND cd.repeatsCount>1"
" AND cm.mediaType=" mediaType;
break;
case 3: // Sort by Date
String ASCDESC = getIntent().getStringExtra("ascdesc");
Log.d("","ASCDESC : " ASCDESC);
if (extra != 0)
sql = "SELECT DISTINCT cm.cardId, cm.objectId "
"FROM cardmedias AS cm " "INNER JOIN cards AS cd "
"ON (cm.cardId = cd.objectId) "
"INNER JOIN categories AS cats "
"ON (cd.categoryId = cats.objectId) "
"WHERE cd.collectionId=" collId
" AND cd.repeatsCount>1"
" AND cm.mediaType=" mediaType
" ORDER BY cd.dateCreated " ASCDESC;
else if (extra == 0)
sql = "SELECT DISTINCT cm.cardId, cm.objectId "
"FROM cardmedias AS cm " "INNER JOIN cards AS cd "
"ON (cm.cardId = cd.objectId) "
"INNER JOIN categories AS cats "
"ON (cd.categoryId = cats.objectId) "
"WHERE cd.collectionId=" collId
" AND cd.repeatsCount>1"
" AND cm.mediaType=" mediaType;
break;
}
return sql;
}
}